一、事务的特性
- 原子性:事务包含的所有操作要么全部成功要么全部失败
- 一致性:使数据库从一个一致性状态变换到另一个一致性状态,比如A有100元 B有0元,A转给B50元,结果为A50元B50元
- 隔离性:多个并发事务之间要相互隔离
- 持久性:事务提交后对数据库的改变是永久的
二、事务的隔离级别
- 未提交读:读数据不加锁;写数据加行级S锁,事务结束释放
- 已提交读:读数据加行级S锁,读完就释放;写数据加行级X锁,事务结束释放。
- 可重复读:(默认)读数据加行级S锁,事务结束释放;写数据加行级X锁,事务结束释放。
- 串行化:读数据加表级S锁,事务结束释放;写数据加表级X锁,事务结束释放。
脏读 | 不可重复读 | 虚读 | |
未提交读 | 1 | 1 | 1 |
已提交读 | 0 | 1 | 1 |
可重复读 | 0 | 0 | 1(已使用间隙锁解决) |
可序列化 | 0 | 0 | 0 |
三、spring事务的传播规则
使用方法: @Transactional(propagation = Propagation.REQUIRES_NEW)
默认为REQUIRED,比较常用的就是REQUIRED、REQUIRES_NEW。
- REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
- MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
- REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
- NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
超级推荐:分布式事务