事务的特性
- 原子性
- 一致性
- 隔离性
- 持久性
事务的隔离级别
READ_UNCOMMITTED
已读但未提交,即一个事务读取到了另一个事务未提交的数据。在这种隔离级别下,会造成”脏读“的情况
READ_COMMTTED
在这个隔离级别下,可以有效避免“脏读”情况的发生。虽然解决了不可重复读的问题,但是在这个隔离级别下无法避免不可重复读取的问题。
RREPEATABLE_READ
可重复读级别是保证在事务处理过程中多次读取同一个数据时的值始终是一致的。可重复读取是通过在事务开启后不允许其他事务对当前记录进行修改操作实现的。
这个隔离级别避免了“脏读”和不可重复读的问题,但是有可能会出现“幻读”。
SERIALIZABLE
顺序读是最严格的事务隔离级别。它要求所有的事务排队依序执行,即事务只能一个接一个地处理,不能并发执行。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ_UNCOMMITTED | Y | Y | Y |
READ_COMMTTED | N | Y | Y |
RREPEATABLE_READ | N | N | Y |
SERIALIZABLE | N | N | N |
4种事务隔离级别, 从上往下,级别越高,安全性越高, 并发性越差。
Spring 事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
ISOLATION_DEFAULT | 同数据库事务隔离级别 | 同数据库事务隔离级别 | 同数据库事务隔离级别 |
ISOLATION_READ_UNCOMMTTED | Y | Y | Y |
ISOLATION_READ_COMMTTED | N | Y | Y |
ISOLATION_REPEATABLE_READ | N | N | Y |
ISOLATION_SERIALIZABLE | N | N | N |
Spring 事务传播行为类型
事务传播行为类型 | 说明 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行 |
PROPAGATION_REQUIRES_NEW | 新建事务. 如果当前存在事务,就把当前事务挂起 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行。如果当前存在事务,则爆出异常 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。与PROPAGATION_REQUIRES_NEW 的差别是PROPAGATION_REQUIRES_NEW是另起一个事务,将会与其父事务相互独立。 PROPAGATION_NESTED事务和其父事务是相依的,其要等父事务一起提交 |