1. 事务的四大特性
- 原子性(Atomicity):事务不可再分,要么都执行,要么都不执行。
- 一致性(Consistency):事务执行前后,数据的完整性保持一致,即修改前后数据总量是一样的大概。
- 隔离性(Isolation):一个事务执行过程中,不会受到其他事务干扰。
- 持久性(Durability):事务一旦结束,对数据库的影响是永久的。数据持久化到数据库中。
在并行程序中可能会出现的问题:
- 脏读:当 A事务 读取 B事务 未提交的数据后,B事务 回滚,导致 A事务 读取到的数据为脏数据。
- 不可重复读:A事务 读取第一次读取数据后,B事务 对该数据进行了修改并提交,A事务 再去读取数据时,前后数据结果不一致。
- 幻读:A事务 读取第一次读取数据后,B事务 又插入或删除了新的数据并提交,A事务 再去读取数据时,前后结果不一致。
2. Spring事务的五个隔离级别
- ISOLATION_DEFAULT:使用数据库默认的事务隔离级别。
- ISOLATION_READ_UNCOMMITTED:事务最低的隔离级别,允许一个事务可以读取另一个事务未提交的数据。 会产生脏读、不可重复读和幻读。
- ISOLATION_READ_COMMITTED: 保证一个事务只能读取另一个事务修改并提交后的数据,不能读取未提交的数据。防止脏读。
- ISOLATION_REPEATABLE_READ:保证一个事务不能更新另一个事务修改但尚未提交的数据。可以避免脏读和不可重复读。
- ISOLATION_SERIALIZABLE:序列化执行所有事务。都避免了,但是效率极低。
3. Spring事务的七个传播行为
在同一个事务中:
- PROPAGION_REQUIRED(默认):支持当前事务,不存在则创建一个新的事务。
- PROPAGION_SUPPORTS:支持当前事务,不存在就以非事务方式运行。
- PROPAGION_MANDATORY:支持当前事务,如果不存在,抛出异常。
不同事务中:
- PROPAGIN_REQUIRES_NEW:当前存在事务则挂起,创建一个新事务。
- PROPAGION_SUPPORTS:当前存在事务则挂起,以非事务方式运行。
- PROPAGION_NEVER:当前存在事务抛出异常,非事务方式运行。
- PROPAGION_NESTED:当前存在事务则嵌套事务执行。