@Transactional注解使用注意事项转载:https://blog.csdn.net/u013929527/article/details/102596243

问题背景

此前在代码中,很多时候都在一个事务(使用spring的@Transactional注解在方法上实现)当中存在多条sql语句,现在的情况是当执行第四条sql语句的时候锁超时了,由于我们对数据库中的表数据进行了锁操作,这个时候数据库只回滚了第四条sql语句,前面其余三条sql语句都没有执行回滚操作。 

MySQL innodb_rollback_on_timeout参数对事务的影响

问题导致的原因

MySQL innodb_rollback_on_timeout参数对事务的影响

MySQL innodb_rollback_on_timeout参数对事务的影响

mysql5.6和mysql5.7的innodb_rollback_on_timeout默认值off导致的

如果使用MySQL 5.6:

innodb_rollback_on_timeout=off的情况下,会回滚最后的造成锁等待的语句,事务没有自动结束.但是这样会造成数据的不一致,破坏了事务的原子性。

innodb_rollback_on_timeout=on的情况下,整个事务回滚后会自动创建一个事务。

如果使用MySQL 5.7:

innodb_rollback_on_timeout=off的情况下和5.6版本是一样的。

innodb_rollback_on_timeout=on的情况下,整个事务已经自动回滚,不会再自动创建事务。

问题总结

所以不管是5.6的版本还是5.7的版本,innodb_rollback_on_timeout最好设置成ON,这样可以避免破坏事务原子性,保证数据一致性。唯一的区别是在5.7版本下需要自己手动开启一个事务。同时也告诉我们在数据库部署之前需要理解数据库的相关配置,根据不同的需求与业务场景相应配置也需做出改变,不一定默认的配置就是最好的配置。

 

相关文章: