用的yii1框架,我用wireshark抓了MySQL的查询包。
首先是发送了:START TRANSACTION查询,然后后面有insert查询,最后也发送了ROLLBACK查询。
但是我一看数据库,那个insert查询的数据在数据库里面有,这可能是怎么回事呀?
我发现里面调用了一个存储过程,存储过程里面有开始一个新的事物,然后提交。不会是这里影响的吧?
存储过程是在insert语句前面调用的。
用的yii1框架,我用wireshark抓了MySQL的查询包。
首先是发送了:START TRANSACTION查询,然后后面有insert查询,最后也发送了ROLLBACK查询。
但是我一看数据库,那个insert查询的数据在数据库里面有,这可能是怎么回事呀?
我发现里面调用了一个存储过程,存储过程里面有开始一个新的事物,然后提交。不会是这里影响的吧?
存储过程是在insert语句前面调用的。
搞清楚了,MySQL不支持嵌套事务,我这里一开始开始了一个事务,后面调用存储过程,里面也开启事务,这里会导致我上一个事务自动提交,然后insert,其实到了这里已经没有事务了,就是单条语句,所以会立即生效。后面的rollback也是无效的。
mysql不支持事务嵌套,如果存储过程里使用了事务,那在这一层就提交了事务,如果你的会话没有设置autocommit=0,那你的后面的insert单独就是一个事务,执行完就提交了,后面的rollback根本没用