欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring事务的传播行为和隔离级别?什么是脏读、不可重复读、幻读?以及MVCC?

程序员文章站 2022-06-14 16:29:51
...

Spring事务的传播行为:
1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这也是通常我们的默认选择。
2、PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
3、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
4、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
5、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

隔离级别:

1.ReadUncommitted:读未提交数据(会出现脏读,不可重复读和幻读). 
2.ReadCommited:读已提交数据(会出现不可重复读和幻读). 
3.RepeatableRead:可重复读(会出现幻读). 
4.Serializable:串行化。一般是不会使用的,他会给每一行读取的数据加锁,会导致大量超时和锁竞争的问题。

脏读:一个事务读取到另一个事务未提交的更新数据,且另一事务失败回滚导致一个事务的数据错误。
不可重复读:在同一个事务中,多次读取同一个数据返回的结果有所不同(后续读取可以读到另一事物已提交的更新数据)。
幻读:一个事务读取到另一个事务已提交的insert数据。

SqlServer:ReadCommited(读取已提交)
Mysql:RepeatableRead(可重复读),每次读取结果都一样,但是有可能产生幻读。

MVCC叫做多版本并发控制,保证隔离性,实际上就是保存了数据在某个时间节点的快照。
我们每行数实际上隐藏了两列,创建时间版本号,过期(删除)时间版本号,每开始一个新的事务,版本号都会自动递增。
MVCC的原理是查找创建版本小于或等于当前事务版本,删除版本为空或者大于当前事务版本。

相关标签: spring