1、MySQL数据库innodb_rollback_on_timeout默认值的危害?
这是官方文档对innodb_rollback_on_timeout的解释:
在MySQL 5.6&5.7中默认值为OFF,当InnoDB默认情况下仅回滚事务超时的最后一条语句。
如果innodb_rollback_on_timeout值为ON,则事务超时后将导致InnoDB中止并回滚整个事务
问题:innodb_rollback_on_timeout为OFF,事务的原子性被破坏了吗?
答:NO,从示例中可以看到,事务只是回退上一条语句的状态,而整个事务实际上没有完成(提交或者回滚),
而作为应用程序在检测这个错误时,应该选择是提交或者回滚事务。如果严格要求事务的原子性,当然是执行ROLLBACK,回滚事务。
2、mysql 默认事务隔离级别是rr,会有next-key lock,目的是为了解决幻读?
select * from lixora where a>100 for update ;会造成 100 以后的记录全部锁定;无法insert
这是官方文档对innodb_rollback_on_timeout的解释:
在MySQL 5.6&5.7中默认值为OFF,当InnoDB默认情况下仅回滚事务超时的最后一条语句。
如果innodb_rollback_on_timeout值为ON,则事务超时后将导致InnoDB中止并回滚整个事务
问题:innodb_rollback_on_timeout为OFF,事务的原子性被破坏了吗?
答:NO,从示例中可以看到,事务只是回退上一条语句的状态,而整个事务实际上没有完成(提交或者回滚),
而作为应用程序在检测这个错误时,应该选择是提交或者回滚事务。如果严格要求事务的原子性,当然是执行ROLLBACK,回滚事务。
2、mysql 默认事务隔离级别是rr,会有next-key lock,目的是为了解决幻读?
select * from lixora where a>100 for update ;会造成 100 以后的记录全部锁定;无法insert
是否改成rc 模式;
oracle 是rc ,且没有机制保障幻读;除非用户加自定义锁;
持续待补充。。。