对于mysql的事物嵌套,个人感觉是一个很危险的事情,举例:
- mysql> select * from test;
- +------+
- | id |
- +------+
- | 1 |
- +------+
- 1 row in set (0.00 sec)
- mysql> start transaction ;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into test values(2);
- Query OK, 1 row affected (0.00 sec)
- mysql> start transaction ;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into test values(3);
- Query OK, 1 row affected (0.00 sec)
- mysql> commit
- -> ;
- Query OK, 0 rows affected (0.00 sec)
- mysql> rollback;
- Query OK, 0 rows affected (0.00 sec)
上面是一个简单的事物嵌套,当事物成功后,假如外层事物失败了,按程序员的角度来说第一个插入应该会失败,但是不是这样的,当子事物提交时其实第一个插入就被提交了,所以后面的外层回滚不会对他产生作用;
一般用事物是最好把你的业务分层几个逻辑块,每一块用一个事物,尽量不要使用事物嵌套;;;