目录
三种状况
脏读:
A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的假数据。
例如:A本来没钱,B为A转账1000但是没有提交,A就看到1000并取走,然后B回滚。这是相当严重的问题。
不可重复读:
A事务读取了B事务已经提交的更改数据,B事务执行了修改操作,A再次读取,发现两次不一样。
假如:A在取款过程中,B往该账户转账200,A取走100后再看余额,发现多了100。
幻读:
A事务读取一个列表时,B事务提交的新增一条数据,A第二次发现多了一条数据。
幻读一般发生在计算统计数据的事务中,例如银行系统在同一个事务中两次统计一组存款账户的总金额,在两次统计中,刚好新增了一个存款账户,存入了100,这时候两次统计的用户和总金额不一致。
四种隔离级别
ISOLATION_READ_UNCOMMITTED:读未提交
ISOLATION_READ_COMMITTED:读已提交
ISOLATION_REPEATABLE_READ:可重复读
ISOLATION_SERIALIZABLE:串行化
可能会出现的情况
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
读未提交 | ✔️ | ✔️ | ✔️ |
读已提交 | x | ✔️ | ✔️ |
可重复读 | x | x | ✔️ |
串行化 | x | x | x |
七种传播行为
在Spring中为方法配置事务,依照业务需求去选择。
PROPAGATION_REQUIRED(XML文件中为REQUIRED)
PROPAGATION_SUPPORTS(XML文件中为SUPPORTS)
PROPAGATION_MANDATORY(XML文件中为MANDATORY)
PROPAGATION_NESTED(XML文件中为NESTED)
PROPAGATION_NEVER(XML文件中为NEVER)
PROPAGATION_REQUIRES_NEW(XML文件中为REQUIRES_NEW)
PROPAGATION_NOT_SUPPORTED(XML文件中为NOT_SUPPORTED)
传播行为 | 含义 |
---|---|
REQUIRED | 当前方法必须在一个具有事务的上下文中运行,如有调用者有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。 |
SUPPORTS | 当前方法不限制是否在事务中运行,有事务则在事务中运行,否则不在。 |
MANDATORY | 表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常 |
NESTED | 如果当前方法正有一个事务在运行中,则该方法运行在一个嵌套事务中,被嵌套的事务可以独立进行提交或者回滚。如果外层事务抛出异常回滚,那么内层事务必须回滚。如果封装事务不存在,则同REQUIRED的一样 |
NEVER | 表示当方法务不应该在一个事务中运行,如果存在一个事务,则抛出异常 |
REQUIRES_NEW | 当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。 |
NOT_SUPPORTED | 表示该方法不应该在一个事务中运行。如果有一个事务正在运行,他将在运行期被挂起,直到这个事务提交或者回滚才恢复执 |