博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事务的四种隔离级别和七种传播行为
阅读量:5263 次
发布时间:2019-06-14

本文共 1555 字,大约阅读时间需要 5 分钟。

很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于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级别

二:数据库传播行为:

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

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类似的操 作。

转载于:https://www.cnblogs.com/626zch/p/10738121.html

你可能感兴趣的文章
hdu 1269(tarjan)
查看>>
SSAS:菜鸟笔记(二)定义计算(DMX脚本)
查看>>
mysql max_allowed_packet查询和修改
查看>>
[NOI1999] 棋盘分割
查看>>
10.25作业
查看>>
Sphinx配置文件分析
查看>>
INFINITY的一个坑
查看>>
fabric文件上传打包与校验
查看>>
Nginx数据结构之红黑树ngx_rbtree_t
查看>>
WWDC 2010学习笔记和目录
查看>>
IDEA 安装scala插件
查看>>
Redis集群配置
查看>>
教你如何在Protel中显示标题栏内容
查看>>
设计模式 策略模式 以角色游戏为背景
查看>>
面试题目——《CC150》高等难题
查看>>
Java-io流入门到精通详细总结
查看>>
数字逗号标记—以前原创(一)
查看>>
Struts1基于Json数据格式的ExtJs单选树(Struts1+Spring+Hibernate)
查看>>
[HNOI2019]白兔之舞(MTT+单位根反演)
查看>>
面向对象基础-集合
查看>>