Spring的事务管理
tx标签用于配置事务管理用于声明和配置事务的相关属性
transaction-manager | 指定一个事务管理器的引用,用于管理事务的生命周期。 |
propagation | 指定事务的传播属性,决定了在嵌套事务中如何处理事务。 |
isolation | 指定事务的隔离级别,用于控制事务之间的隔离程度。 |
timeout | 指定事务的超时时间,用于防止长时间的事务占用数据 |
readOnly | 指定事务是否为只读事务,若为只读事务,则不允许对数据库进行写操作。 |
rollback-for | 指定需要回滚的异常类型,当出现指定的异常时,事务将回滚。 |
no-rollback-for | 指定不需要回滚的异常类型,当出现指定的异常时,事务不会回滚。 |
生命周期
数据库初始状态->start->sql执行->commit、rollback->数据库reflash
传播属性
Required(需要) |
Mandatory(强制必须) |
RequiresNew(需要新的) |
Supports(支持) |
NotSupported(不支持) |
Never(不用) |
- Required(需要) 当前方法必须要求开启事务,如果当前线程不存在事务,则开启新的事务,如果当前线程已经存在事务,就加入到当前事务
- Mandatory(强制必须) 当前方法必须要求事务,如果当前线程不存在事务,就抛出异常,如果存在,就加入到事务里。
- RequiresNew(需要新的) 当前方法必须要求开启新的事务,如果当前线程已经存在事务上下文,就暂停当前事务,等到新事务结束之后,再继续恢复之前的当前方法支持事务,如果当前线程存在事务,就加入到事务中去,如果不存在,不做任何操作。
- Supports(支持) 当前方法支持事务,如果当前线程存在事务,就加入到事务中去,如果不存在,不做任何操作。
- NotSupported(不支持) 当前方法不支持事务,如果当前线程存在事务,就挂起当前事务,执行完当前方法,恢复事务。一般情况下在查询的时候使用,如果一个方法只是查询,并且非常耗时,就可以使用Not Support,避免事务时间超长。
- Never(不用) 当前方法不支持事务,如果当前线程存在事务,则抛出异常
隔离级别
读已提交 READ_COMMITTED |
读未提交 (READ_UNCOMMITTED) |
可重复读 (REPEATABLE_READ) |
可序列化读 (SERIALIZABLE) |
- "读未提交(READ_UNCOMMITTED)" 数据库最弱的隔离级别(完全不隔离),存在脏读、不可重复读、幻读的诸多问题
- "读已提交READ_COMMITTED" 不允许事务B读取事务A还未提交的update操作更新后的数据(但是可见)。避免了脏读,但还可能出现不可重复读、幻读。
- "可重复读(REPEATABLE_READ)" 所有被Select获取的数据都不能被修改,但是却没有办法控制幻读(可以增加数据)。
- "可序列化读(SERIALIZABLE);" 事务之间最高的隔离界别,只能顺序的读取数据,当一个事务在读取和修改数据的时候,另外一个事务只能挂起,直到正在读取和修改数据的事务提交之后,挂起的事务才能执行.
数据库并发性问题
脏读 "对未提交的数据的读取。
一个事务对另一个事务中待定状态的数据,读取到了并且处理,所产生的依赖关系。"不可重复读 同一个事务在两次读取之间该数据被其它事务所修改,两次读取的数据不同。
幻读 一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据
基本性质
原子性 (Atomicity) | 一个事务中的所有操作,要么全部成功,要么全部失败 |
一致性 (Consistency) | 事务执行前后,基于原子性,保证数据的一致性,例如A,B帐号之间的转账。 |
隔离性 (Isolation) | 事务和事务的可见性 |
持久性 (Durability) | 事务完成以后,所有的数据都将持久到数据库中,不会因为其他原因而丢失 |