MySQL嵌套事务的讨论

MySQL嵌套事务的讨论

原创  2014年07月22日 11:29:33

在看MySQL Internals Manual 文档时有一段关于MySQL历史的讨论其中有一些nested transaction的讨论,有兴趣的读者可以通过下面的连接进行查看

点击打开链接

于是想实验一下现在MySQL嵌套事务怎么处理的。我的MySQL版本为5.6

首先在test中建一张及其简单的表create table t(c1 int);然后我们执行下面的sql序列

[sql]  view plain  copy
  1. mysql> select * from t;  
  2. +------+  
  3. | c1   |  
  4. +------+  
  5. |    1 |  
  6. +------+  
  7. 1 row in set (0.00 sec)  
  8.   
  9. mysql> start transaction ;  
  10. Query OK, 0 rows affected (0.00 sec)  
  11.   
  12. mysql> insert into t values(2);  
  13. Query OK, 1 row affected (0.00 sec)  
  14.   
  15. mysql> start transaction ;  
  16. Query OK, 0 rows affected (0.00 sec)  
  17.   
  18. mysql> insert into t values(3);  
  19. Query OK, 1 row affected (0.00 sec)  
  20.   
  21. mysql> commit  
  22.     -> ;  
  23. Query OK, 0 rows affected (0.00 sec)  
  24.   
  25. mysql> rollback;  
  26. Query OK, 0 rows affected (0.00 sec)  

从上面的代码中可以看出,一开始表t中的数据只有一条1,然后我们弄了一个嵌套事务,外层插入数据2,内层插入数据3,然后内层的事务提交,外层的事务会滚

那么会得到什么结果呢,我一开始的想法时此时表t中的数据应该是1,2。但事实是

[sql]  view plain  copy
  1. mysql> select * from t;  
  2. +------+  
  3. | c1   |  
  4. +------+  
  5. |    1 |  
  6. |    2 |  
  7. |    3 |  
  8. +------+  
  9. rows in set (0.00 sec)  

这是为什么呢??

原来start transaction 这条SQL会自动执行commit,即开启内层事务的时候,外层的插入2这条SQL事务被commit了。所以最后一个rollback没有起到任何的作用。


补充说明:

1 .除了start transaction会引起commit之外,下面的语句也会引起commit

[sql]  view plain  copy
  1. ALTER FUNCTION    
  2. ALTER PROCEDURE    
  3. ALTER TABLE    
  4. BEGIN    
  5. CREATE DATABASE    
  6. CREATE FUNCTION    
  7. CREATE INDEX    
  8. CREATE PROCEDURE    
  9. CREATE TABLE    
  10. DROP DATABASE    
  11. DROP FUNCTION    
  12. DROP INDEX    
  13. DROP PROCEDURE    
  14. DROP TABLE    
  15. UNLOCK TABLES    
  16. LOAD MASTER DATA    
  17. LOCK TABLES    
  18. RENAME TABLE    
  19. TRUNCATE TABLE    
  20. SET AUTOCOMMIT=1    
  21. START TRANSACTION    

2. 实验的autocommit设置为1 表示每一条SQL都会自动提交,不希望这样可以set autocommit =0

3. 实验的存储引擎是InnoDB。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值