事务嵌套会隐式触发commit

mysql中事务嵌套会隐式触发commit

测试

image.png

注意:在第二个事务开始的时候其实就已经提交了事务。

autocommit

select @@autocommit
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交 默认值为1.

MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务。
在复杂的应用场景下这种方式就不能满足需求了。

创建一个事务的2中方式:

所以为了打开事务,允许在COMMIT和ROLLBACK之前多条语句被执行,我们需要做以下两步:
1, 设置MySQL的autocommit属性为0,默认为1
2,使用START TRANSACTION语句显式的打开一个事务

如果已经打开一个事务,则SET autocommit=0不会起作用,因为START TRANSACTION会隐式的提交session中所有当前的更改,结束已有的事务,并打开一个新的事务。

通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT,所以应该在事务中尽可能少用或注意一下:

ALTER FUNCTION  
ALTER PROCEDURE  
ALTER TABLE  
BEGIN  
CREATE DATABASE  
CREATE FUNCTION  
CREATE INDEX  
CREATE PROCEDURE  
CREATE TABLE  
DROP DATABASE  
DROP FUNCTION  
DROP INDEX  
DROP PROCEDURE  
DROP TABLE  
UNLOCK TABLES  
LOAD MASTER DATA  
LOCK TABLES  
RENAME TABLE  
TRUNCATE TABLE  
SET AUTOCOMMIT=1  
START TRANSACTION  

一旦一个事务里面涉及到以上语句就会自动执行commit操作,(事务嵌套操作)

注意

当然这是直接操作数据库,如果在框架中例如laravel我们可以嵌套事物,而不会出问题,是因为有的框架已经帮我们处理好了。所以在laravel框架中测试事务嵌套和mysql测试的结果不一样,有兴趣的可以查看laravel源码。到时候可以一起讨论讨论。

你可能感兴趣的:(事务嵌套会隐式触发commit)