当前位置:Gxlcms > 数据库问题 > MySQL ------ 事务处理(transaction)(二十八)

MySQL ------ 事务处理(transaction)(二十八)

时间:2021-07-01 10:21:17 帮助过:16人阅读

 

One、在使用事务和事务处理时常用的关键字 

事务transaction)指一组SQL语句

回退rollback)指撤销指定SQL语句的过程

提交commit)指将未存储的SQL语句结果写入数据表

保留点savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)

注意:当commit 或 rollback 语句执行后,事务会自动关闭 

 

Two、开启事务

管理事务处理的关键在于将sql语句组分解成逻辑块,并确定规定数据何时应该回退,何时不应该回退。

-- 标识事务的开始
start transaction

 

Three、使用 ROLLBACK(回退:用来管理insert 、update、delete 语句

ROLLBACK 只能在一个事务处理内使用,也就是在执行了一条start transaction之后,将start transaction 之后的所有语句回退。

-- 开启事务
start transaction;
-- 在事务中删除 ordertotals
 delete from ordertotals;
-- 查看一下还有没
select * from ordertotals;
-- 回退,反悔了不能删除
 rollback;

 技术图片

 上述,首先查询不为空的一个表,然后开启了一个事务处理,用一条delete语句删除这个表中的所有行,验证一下是否空了,这时用一条回退(rollback)语句,将start transaction 之后的所有语句回退,最后验证一下是否成功。

注意:

事务处理ROLLBACK用来管理insert 、update、delete 语句,不能回退Crete、drop、select操作(虽然可以执行但是没用)。

 

Four、使用COMMIT(提交)

 一般的MySQL语句都是直接针对数据表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(也可以叫写、保存)操作是自动进行的。

注意:在事务处理块中,提交不会隐含地进行,为了进行明确的提交,要使用commit 语句。

-- 从数据库中删除订单号为 20007的订单,注意要先删除明细在删除订单,不然由于主外键的关系导致删除不了
--  开启事务
start transaction;
-- 删除明细表中
 delete from orderitems where order_num = 20007;
-- 删除订单表中
delete from orders where order_num = 20007;
-- 提交
 commit;

技术图片

 

 

 上述中,从数据库中完全删除订单20010.,主要涉及更新两个数据表orders 和 orderitems,所以使用事务处理块来保证订单不被部分删除,最后使用commit 语句仅在不出错时写出更改,如果第一条删除语句起作用,但第二条失败,则delete语句不会被提交(而会被自动撤销)

 

Five、使用保留点(savepoint)

简单的rollback 和commit 语句就可以写入或撤销整个事务处理,但是更复杂事务处理可能会部分提交或回退,所以引入了保留点

如之前的添加订单场景,如果发生错误回退到 添加 orders 行之前就行,不需要回退到客户表

为了支持回退部分事务处理,必须能在事务处理块中合适的位置防止占位符,这样如果需要回退,就可以回退到某个占位符。而这些占位符就称为保留点(创建时可以使用 savepoint 声明)

-- 创建保留点
savepoint 保留点名

-- 回退到保留点
rollback to 保留点名

技术图片

注意:

1、每个保留点的名字必须要唯一而且要有意义,以便在回退时,MySQL知道回到哪

2、可以设置任意多的保留点,而且时越多越好,因为保留点越多,就越可以灵活的进行回退

3、保留点在事务处理完成(即执行一条Rollback或commit )之后自动释放,在MySQL 5 后也可以用RELEASE SAVEPOINT 明确的释放保留点。

 

Six、更改默认的提交 (autocommit)

默认的MySQL行为时自动提交所有更改,也就是任何时候执行一条MySQL语句,该语句对表的更改时立即执行生效的。如果要想关闭可以使用以下语句;

-- 关闭默认提交
set autocommit = 0;

注意:

1、autocommit 决定是否自动提交更改,不管有没有commit 语句,设置autocommit 为 0(假)指示MySQL不自动提交更改,直到autocommit设置为真时为止。

2、autocommit 标志是针对每个连接而不是服务器。

 

MySQL ------ 事务处理(transaction)(二十八)

标签:占用   ace   解决   一个   int   出错   ems   引入   bsp   

人气教程排行