数据库事务4种隔离级别及7种传播行为

一:数据库的事物隔离级别与传播行为总结:

            

 

脏数据
  脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据(Dirty Data),依据脏数据所做的操作可能是不正确的。

不可重复读
  在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读

 

很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。

避免不可重复读需要锁行就行

避免幻影读则需要锁表

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。

所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题。

 

 

数据库中事务的四大特性(ACID)

(1) 原子性 ⑵ 一致性 ⑶ 隔离性 ⑷ 持久性

现在来看看MySQL数据库为我们提供的事物的四种隔离级别:

关于spring的事务隔离级别与数据库的一样,也是下面的四个,只不过多了一个default

1.Read uncommitted (读未提交):最低级别,任何情况都无法保证。

2.Read committed (读已提交):可避免脏读的发生。

3.Repeatable read (可重复读):可避免脏读、不可重复读的发生。

4.Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

 

 以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

  在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别

 

isolation(隔离)

4.查看MySQL数据库当前事务的隔离级别select @@tx_isolation;

5.在MySQL数据库中设置事务的隔离 级别: set tx_isolation=’隔离级别名称;’

6.查看mysql的事物是否是自动提交

1或者on代表启用,0或者off代表禁用,当autocommit=0时,所有的差丶都是在一个事物中,直到显示的执行commit提交或者rollback回滚,该事物结束,同时又开始了另一个新的事物

 

 

二:数据库的传播行为:

 

传播行为分为两种:分为支持事物的传播和不支持事物的传播

1、PROPAGATION_REQUIRED:(支持事物)如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2、PROPAGATION_SUPPORTS:(支持事物)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

3、PROPAGATION_MANDATORY:(支持事物)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4、PROPAGATION_REQUIRES_NEW:(支持事物)创建新事务,无论当前存不存在事务,都创建新事务。

5、PROPAGATION_NOT_SUPPORTED:(不支持事物)以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6、PROPAGATION_NEVER:(不支持事物)以非事务方式执行,如果当前存在事务,则抛出异常。

7、PROPAGATION_NESTED:(不支持事物)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

已混淆点:spring的事务是什么?与数据库的事务是否一样

本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作

 

参考文章:

 

https://www.cnblogs.com/WJ-163/p/6023054.html

https://www.cnblogs.com/fjdingsd/p/5273008.html

  • 21
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
事务传播行为指的是事务对其他事务的可见性和影响范围。在数据库系统中,有四种常见的事务传播行为: 1. REQUIRED:默认的传播行为。如果当前没有事务存在,则新建一个事务。如果已经存在事务,则加入到当前事务中。 2. REQUIRES_NEW:每次都创建一个新的独立事务,暂停当前事务(如果存在),并在新事务完成后恢复之前的事务。 3. SUPPORTS:如果当前存在事务,则加入到当前事务中;如果没有事务存在,则以非事务方式执行。 4. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起该事务,执行完操作后再恢复之前的事务隔离级别指的是多个并发执行的事务之间的隔离程度,主要为了解决并发访问数据库时可能出现的问题。常见的隔离级别有: 1. READ UNCOMMITTED(未提交读):一个事务可以读取到其他未提交的事务所做的修改,可能会导致脏读、不可重复读和幻读的问题。 2. READ COMMITTED(已提交读):一个事务只能读取到其他已提交的事务所做的修改,解决了脏读问题,但可能会出现不可重复读和幻读。 3. REPEATABLE READ(可重复读):一个事务在执行期间多次读取同一数据时,能够保证读取的数据是一致的。解决了不可重复读问题,但可能会出现幻读。 4. SERIALIZABLE(串行化):最高的隔离级别,通过对事务进行串行执行来避免并发问题,保证了数据的一致性,但牺牲了并发性能。 不同的传播行为隔离级别适用于不同的场景,开发人员需要根据实际需求选择合适的配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值