什么是事务
事务(Transaction)是访问并可能更新数据库中各项数据项的一个程序执行单元(unit)。 事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。
事务结束有两种,事务中的步骤全部成功执行时,提交事务。如果其中一个失败,那么将会发生回滚操作,并且撤销之前的所有操作。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
事务是恢复和并发控制的基本单位。
事务具有四个特征:原子性、一致性、隔离性和持久性。这四个特征通常称为ACID。
事务的四大特性
原子性(Atomicity):事务不可再分,要么都执行,要么都不执行。
一致性(Consistency):事务执行前后,数据的完整性保持一致,即修改前后数据总量是一样的大概。
隔离性(Isolation):一个事务执行过程中,不会受到其他事务干扰。
持久性(Durability):事务一旦结束,对数据库的影响是永久的。数据持久化到数据库中。
在并行程序中可能会出现的问题:
脏读:当 A事务 读取 B事务 未提交的数据后,B事务 回滚,导致 A事务 读取到的数据为脏数据。
不可重复读:A事务 读取第一次读取数据后,B事务 对该数据进行了修改并提交,A事务 再去读取数据时,前后数据结果不一致。
幻读:A事务 读取第一次读取数据后,B事务 又插入或删除了新的数据并提交,A事务 再去读取数据时,前后结果不一致。
Spring事务的五个隔离级别
ISOLATION_DEFAULT:使用数据库默认的事务隔离级别。
读未提交:ISOLATION_READ_UNCOMMITTED:事务最低的隔离级别,允许一个事务可以读取另一个事务未提交的数据。 会产生脏读、不可重复读和幻读。
读已提交:ISOLATION_READ_COMMITTED: 保证一个事务只能读取另一个事务修改并提交后的数据,不能读取未提交的数据。防止脏读。
可重复性:ISOLATION_REPEATABLE_READ:保证一个事务不能更新另一个事务修改但尚未提交的数据。可以避免脏读和不可重复读。
序列化:ISOLATION_SERIALIZABLE:序列化执行所有事务。都避免了,但是效率极低。
Spring事务的七个传播行为
其实就是两个方法,一个方法调用了另一个方法,其中一个方法有事务,那么另一个方法的事务是新建还是怎么样,用传播机制来规定。
有七种传播机制,分别是:
在同一个事务中:
PROPAGION_REQUIRED(默认):支持当前事务,不存在则创建一个新的事务。
翻译过来叫必须的,意思是如果有事务就加入事务,没有的话就新建一个。
PROPAGION_SUPPORTS:支持当前事务,不存在就以非事务方式运行。翻译过来叫支持,意思是如果当前存在事务,则加入事务,如果不存在事务,则以非事务运行
PROPAGION_MANDATORY:支持当前事务,如果不存在,抛出异常。翻译过来叫强制,意思是如果当前存在事务,则运行在当前事务中,如果不存在事务,则抛出异常
不同事务中:PROPAGIN_REQUIRES_NEW:当前存在事务则挂起,创建一个新事务。
翻译过来叫必须是新的,意思是新建事务,如果存在事务,那么把当前事务挂起
NOT_SUPPORTED:当前存在事务则挂起,以非事务方式运行。翻译过来叫不支持,意思是以非事务运行,如果存在事务,则把当前事务挂起。
PROPAGION_NEVER:当前存在事务抛出异常,非事务方式运行。翻译过来叫从不,意思是以非事务运行,如果当前存在事务,则抛出异常
PROPAGION_NESTED:当前存在事务则嵌套事务执行。翻译过来叫嵌套的,意思是如果当前存在事务则在嵌套事务内执行。如果没有事务则执行REQUIRED类似的操作。