首页 > 其他分享 >事务的隔离级别

事务的隔离级别

时间:2022-11-11 14:46:03浏览次数:79  
标签:事务 隔离 重复 数据 脏读 级别

原文网址:https://blog.csdn.net/zhouym_/article/details/90381606

事务的四大特性分别是:原子性、一致性、隔离性、持久性

幻读和不可重复读都是在同一个事务中多次读取了其他事务已经提交的事务的数据导致每次读取的数据不一致,所不同的是不可重复读读取的是同一条数据,而幻读针对的是一批数据整体的统计(比如数据的个数)

以MYSQL数据库来分析四种隔离级别

第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

解决了更新丢失,但还是可能会出现脏读

第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

解决了更新丢失和脏读问题

第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

解决了更新丢失、脏读、不可重复读、但是还会出现幻读

 

 

第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

解决了更新丢失、脏读、不可重复读、幻读(虚读)

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

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

在MYSQL数据库中查看当前事务的隔离级别

SELECT @@tx_isolation;

在MYSQL数据库中设置事务的隔离级别:

 

 

 

记住:设置数据库的隔离级别一定要是在开启事务之前:

如果是使用JDBC对数据库的事务设置隔离级别的话,也应该是在调用Connecton对象的setAutoCommit(false)方法之前,调用Connection对象的setTransactionIsolation(level)即可设置当前连接的隔离级别,至于参数level,可以使用Connection对象的字段:

在JDBC中设置隔离级别的部分代码:

 

 

 

 

隔离级别的设置只对当前连接有效,对于使用MYSQL命令窗口而言,一个窗口就相当于一个连接,当前窗口设置的隔离级别只对当前窗口中的事务有效,对于JDBC操作数据库来说,一个Connection对象相当与一个连接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他连接Connection对象无关
————————————————
版权声明:本文为CSDN博主「zhouym_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouym_/article/details/90381606

标签:事务,隔离,重复,数据,脏读,级别
From: https://www.cnblogs.com/bruce1992/p/16880413.html

相关文章

  • 4. 声明式事务
    1.JdbcTemplateSpring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作,可以方便对数据库的增删改查1.1对JdbcTemplate的准备工作(1)加入依赖<depende......
  • serilog 动态更新日志级别
    使用这个库,更新配置文件,就可以动态更新日志输出级别。newLoggerConfiguration().ReadFrom.Configuration(hostingContext.Configuration)这个Configuration定义在这儿......
  • 隔离第二天
    昨晚睡的巨好,一觉睡到8点半,连早八的签到都忘了,好突然跟做梦一样,还是没有桌子没有凳子,听了一节的网课,全是都疼,接着躺床上。......
  • Hibernate简单注解开发和事务处理(四)
    勿以恶小而为之,勿以善小而不为--------------------------刘备劝诸君,多行善事积福报,莫作恶上一章简单介绍了Hibernate实现简单的CRUD操作和常见类(三),如果没有看过,​​请观......
  • 安科瑞隔离电源系统在安徽某医院中的应用
    陈盼安科瑞电气股份有限公司 上海嘉定 201801摘要:目前,医用IT系统主要应用于诸如手术室、ICU/CCU重症监护室等重要的医疗2类场所,为这些场所的重要设备提供安全、可靠、......
  • 浅析Spring事务实现原理
    SQL事务实现简介首先我们来了解下,最简单的事务是怎么实现的呢?以JDBC为例,当一个数据库Connection对象创建后,其会默认自动提交事务;每次执行SQL语句时,如果成功,就会向数据库自......
  • 结束酒店隔离后的第一天
    写在前面——发现这个新地方,可以在这里写写小记,不受其他的纷纷扰扰,不害怕微信朋友圈都不是朋友,可是又按捺不住这该死的分享欲,记录下平凡的生活。11月3号的那天,依......
  • 分布式事务
    分布式事务本地事务本地事务存在问题1.远程服务假失败:远程服务其实成功了,由于网络故障等没有返回。导致:订单回滚,库存却扣减2.远程服务执行完成,下面的其他方法出现问......
  • SAP 自建事务码
    自建事务码的事务码se93一般来说开发人员会遇到,开发了报表已经一些功能,不会让业务人员通过se38来进行使用,一般会新建一个事务码让业务人员在t-code中的使用配置对应......
  • jmeter事务管理器
    逻辑事务器,将一个操作产生的请求放在一起if控制器,当条件满足时执行if控制器${__groovy("${msg}"=="不允许重复挂号,请检查接诊列表是否有初诊或者复诊!")} ......