事务
事务
事务是一个并发控制的单位,是用户定义的一个操作序列。包含了多个sql操作。
事务特性
原子性:要么都做,要么都不做。
一致性:完成事务后,所有的数据必须是一致的,比如转账。
隔离性:事务之间是隔离操作的。
持久性:事务完成之后,不能再返回原状态了。
不隔离时可能发生的问题
1.脏读:比如一个事务t1有2条修改数据的sql,执行完第一条后,事务t2读取了数据,然而t1的第二条sql还没执行,导致读取数据不对,这就是脏读。
2.不可重复读:事务t1读取数据,事务t2修改了数据,事务t1短时间内又读取,发现数据不同了,这就是不可重复读。
3.幻读:事务t1修改了数据,此时t2事务插入又修改了数据,导致t1查看数据时发现数据不对,这就是幻读。
事务隔离级别(Mysql)
1.Serializable(串行化):相当于给表上锁,隔离级别最高,但执行效率最低
2.Repeatable Read(可重复读):可避免脏读和可重复读的发生。
3.Read Commited(读已提交):避免脏读。 Mysql的默认级别
4.Read UnCommited(读未提交):什么都不能避免。
Spring事务传播
事务传播(嵌套):在service中一个事务/非事务方法调用了另一个事务/非事务方法。
前提:方法A调用了方法B
Required:如果A启动了事务,则B就不用再启动事务;如果A没有启动事务,则B需要启动事务。
Supports:如果A启动了事务,则B不用启动;如果A不启动,B也不启动。
Required_New:新启动B事务,并将A事务挂起,等到B事务执行完再继续执行,如果B事务失败了,AB都回滚,如果A失败B成功,则只有A回滚B不回滚。
Never:B事务直接抛出异常。
Nested:B事务成为A事务的子事务,即”嵌套事务“,B开始执行时候获得一个savepoint,如果B失败,则A回滚到savepoint的位置,只有A执行完成B才会被真正提交。