事务的特性-ACID
Atomicity:原子性
一个事务,多次数据操作全部成功,才会提交。数据操作要么全部成功,要么全部失败
Consistency:一致性
事务提交成功后,数据的状态和他的业务规则是一致的
Isolation:隔离性
多个事务,数据的状态相互不影响,独立在自己的空间
Durability:持久性
事务提交成功后,数据的状态永久的保留住
事务的隔离级别
未提交读
一个事务可以读取到另一个事务没有提交的修改数据
可产生的问题:脏读,不可重复读,幻读
已提交读
一个事务可以读取到另一个事务已经提交的修改数据
可产生的问题:不可重复读,幻读
可重复读
一个事务多次读取同一个数据操作,结果集是相同的
可产生的问题:幻读
可串行化
每个事务不是并发执行的,是串行执行
可产生的问题:无
事务隔离级别产生的问题
脏读
一个事务读取到了另一个事务没有提交就修改的数据
不可重复读
一个事务多次读取到了另一个事务已经提交修改的最新数据
幻读
一个事务多次读取到了另一个事务已经提交的插入数据
Mysql解决幻读的方式
MVCC-多版本并发控制
使用ReadView读取快照方式
提交读隔离级别每次查询,都生成ReadView,获取数据
可重复读隔离级别只在第一次查询,生成一次ReadView,后面都使用第一次生成的ReadView
Gap锁
Mysql中的lock_gap锁,另一个事务不能在加锁的记录前后执行数据操作
Spring事务实现的方式
通过AOP实现
Spring事务的传播属性
Required
如果有事务,那么加入事务,如果没有事务,则创建一个新事务
Required_new
有没有事务,都会创建一个新事务执行。
如果被调用方法成功执行,调用方法之后异常,被调用方法不会回滚
原因:调用方法会挂起,执行被调用方法事务
Nested
如果有事务,创建一个嵌套事务,如果没有事务,创建一个新事务
如果被调用方法执行成功,调用方法之后异常,被调用方法会回滚
原因:被调用方法会存放在savePoint中,等待调用方法一起执行事务
Mandatory
必须在事务中运行,否则抛出异常
Never
必须不在事务中运行,否则抛出异常
Supports
如果有事务,加入该事务,如果没有事务,以非事务方式运行
Not_supported
全部以非事务方式运行
Spring事务失效的原因
1.应用在非pulic修饰符上
2.同一个类中,方法相互调用
3.事务传播属性设置错误
4.try/catch了异常,没有抛出runtime异常