事务知识点的简单概括

177 阅读3分钟

事务的特性-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异常