最近项目中碰到事务相关的bug,在这里总结一下,Spring中最常见的事务传播和事务隔离机制。
1.事务隔离
1.1 事务隔离等级(假设有2个事务,transactionA和transactionB)
1⃣️.脏读
TransactionA中将变量status从0改为1,但是未提交
TransactionB读取变量status为1
TransactionA回滚,导致TransactionA读取到的值有错误
2⃣️.不可重复读
TransactionA第一此读取到的status为0
TransactionB将status改为1
TransactionA读取到的status为1 两次读取的值i不一致
3⃣️.幻读
幻读和不可重复读很像,脏读是行级的,幻读是表级的
TransactionA读取表中数据为3行
TransactionB在表中插入一行数据
TransActionA读取表中的数据为4行
1.2 Spring中通过@TransAction注解实现事务的声明式控制,该注解可以通过isolation属性设置隔离级别,各个级别的事务如下:
1⃣️.Isolation.READ_UNCOMMITED
读未提交,脏读,不可重复读,幻读都无法解决,即TransactionA可以读取到TransactionB中为提交的事务
2⃣️.Isolation.READ_COMMITED