JDBC之事务隔离级别以及ACID特性

news/2025/6/20 4:19:40

事务隔离级别:

  1.更新遗失(Lost update)

  

  两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

  基本上就是指某个事务对字段进行更新的信息,因另一个事务的介入而遗失更新效力。举例来说,若某个字段数据原为ZZZ,用户A、B 分别在不同的时间点对同一字段进行更新事务,如下图:

 

 

  单就用户A 的事务而言,最后字段应该是OOO,单就用户B 的事务而言,最后字段应该是ZZZ。在完全没有隔离两者事务的情况下,由于用户B 撤销操作时间在用户A 确认之后,因此最后字段结果会是ZZZ,用户A看不到他新确认的OOO 结果,用户A 发生更新遗失问题。

  如果要避免更新遗失问题,需要设置隔离级别为“可读取未确认”(Read Uncommitted,如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。

  该隔离级别可通过“排他写锁”实现。JDBC 可通过Connection 的setTransactionIsolation()设置为TRANSACTION_UNCOMMITTED 来提示数据库指定此隔离行为。

  实现后如下图:

  提示数据库“可读取未确认”的隔离层次之后,数据库至少得保证事务能避免更新遗失问题,通常这也是具备事务功能的数据库引擎会采取的最低隔离层级。不过这个隔离层级读取错误数据的机率太高,一般默认不会采用这种隔离级别。

  2.脏读(Dirty read)

  两个事务同时进行,其中一个事务更新数据但未确认,另一个事务就读取数据,就有可能发生脏读问题,也就是读到所谓脏数据、不干净、不正确的数据。如下图:

  如果要避免脏读问题,可以设置隔离层级为“可读取确认”(Read committed)。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。也就是事务读取的数据必须是其他事务已确认的数据。JDBC 可通过Connection 的setTransactionIsolation()设置为TRANSACTION_COMMITTED 来提示数据库指定此隔离行为。

  实现后如下图所示:

  提示数据库“可读取确认”的隔离层次之后,数据库至少得保证事务能避免脏读与更新遗失问题。

  3.无法重复的读取(Unrepeatable read)

  某个事务两次读取同一字段的数据并不一致。如下图:

  如果要避免无法重复的读取问题, 可以设置隔离层级为“可重复读取”(Repeatable read),这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。也就是同一事务内两次读取的数据必须相同。JDBC 可通过Connection 的setTransactionIsolation()设置为TRANSACTION_REPEATABLE_READ 来提示数据库指定此隔离行为。

  实现后如下图所示:

  在数据库上这个做法影响性能较大,另一个基本做法是事务正在读取但尚未确认前,另一事务会在暂存表格上更新。提示数据库“可重复读取”的隔离层次之后,数据库至少得保证事务能避免无法重复读取、脏读与更新遗失问题。

  4.幻读(Phantom read)

  同一事务期间,读取到的数据笔数不一致。例如,事务A 第一次读取得到五笔数据,此时事务B 新增了一笔数据,导致事务B 再次读取得到六笔数据。

  如果隔离行为设置为可重复读取,但发生幻读现象,可以设置隔离层级为“可循序”(Serializable),它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。也就是在有事务时若有数据不一致的疑虑,事务必须可以按照顺序逐一进行。JDBC 可通过Connection 的setTransactionIsolation()设置为TRANSACTION_SERIALIZABLE 来提示数据库指定此隔离行为。

  隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

  下面是隔离行为与可预防的问题

隔离行为

更新遗失

脏读

无法重复读取

幻读

可读取未确认Read   Uncommitted

预防

 

 

 

可读取确认

Read Uncommitted

预防

预防

 

 

可重复读取

Repeatable read

预防

预防

预防

 

可循序

Serializable

预防

预防

预防

预防

 

  数据库事务的ACID特性:

  1. 原子性(Atomicity)

  整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  例如:银行刷卡业务,当消费的时候A顾客的卡钱减少,然后B商城的账户加钱,只有当这2个操作都成功的时候才可以进行提交,否则都必须回滚。这就是事务的原子性,因为这2个操作不可以分开。

  2. 一致性(Consistency)

  在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  例如:有表A和表B,表A中的一个字段aa是表B中bb字段的外键,并且bb字段是必填的,当在B表中插入数据的时候如果bb字段的值在A表中没有,则事务必须回滚否则会破坏数据库的完整性约束。

  3. 隔离性(Isolation)

  两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

  例如:A顾客银行卡刷的钱与B顾客互相不影响。

  4. 持久性(Durability)

  在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

  例如:在A顾客消费成功后,银行卡的钱不可以被回滚。

 

 

 

转载于:https://www.cnblogs.com/renchunxiao/p/3297612.html

文章来源:https://blog.csdn.net/weixin_33691700/article/details/93619593
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-3655877.html

相关文章

百度SEO:最新搜索引擎排名因素有哪些?

搜索引擎排名规则,一直以来都是一个争论的焦点,随着百度算法的不断调整,实际上它是一个动态因素,自从熊掌号上线以来,可谓搜索排序大洗牌,毫无疑问内容是基石,它几乎更古不变,而链接…

Python字符串通过+和join函数拼接新字符串的性能比较

有一道Python面试题, 以下代码有什么局限性,要如何修改 def strTest(num):s Hellofor i in range(num):s xreturn s 上面的代码其实可以看出:由于变量str是不变对象,每次遍历,Python都会生成新的str对象来存储新的…

抚琴煮酒Linux系统运维培训班第⑤期招生

抚琴煮酒Linux系统运维培训班第⑤期继续招生了,第⑤期也会秉承前面四期的教学宗旨:拓宽学员的知识面,提升职业竞争力。教学内容和文档是经过前面四期学员的反馈意见整理,而且经过前面的沉淀和积累,现在也比较成熟了&am…

机器学习的一些概念

dnn 深度神经网络 cnn 卷积神经网络 rnn 循环神经网络 转载于:https://www.cnblogs.com/thecoreofbusiness/p/8249726.html

java8学习:Optional的简单使用

内容来自《 java8实战 》,本篇文章内容均为非盈利,旨为方便自己查询、总结备份、开源分享。如有侵权请告知,马上删除。书籍购买地址:java8实战如下代码 public class Person {private Car car;public Car getCar() {return car;} …

AI影响物联网和基因科技进步

BOE(京东方)全球创新伙伴大会-2017今日开幕。会上,京东方创始人、董事长王东升发表主题演讲称,人工智能作为第四次产业革命的关键性触发点科技,影响着物联网和基因科技的进步。王东升表示,从1950年到2015年,是人工智能…

Python中复制文件的两种简单方式

用Python拷贝文件的方式其实有很多,但个人觉得最简单、最直接的可能是这么两种: 方法一:借助操作系统中本身的拷贝命令 >>> import os >>> os.system("xcopy C:\\1.txt D:") C:\1.txt 1 File(s) copied 0 方法二&#xf…

yum -y upgrade 和 yum -y update 区别

分别测试yum -y upgrade和yum -y update升级前 系统版本: centos5.5 内核版本: 2.6.18-194.el5 升级前做过简单配置文件修改yum -y upgrade 升级后 系统版本: centos5.7 内核版本: 2.6.18-194.el5 系统…

FCC-学习笔记 Pig Latin

FCC-学习笔记 Pig Latin 1>最近在学习和练习FCC的题目。这个真的比较的好,推荐给大家。 2>中文版的地址:https://www.freecodecamp.cn/;英文版的地址:https://www.freecodecamp.org 3>这次写关于一个JS的问题,名为Pig Latin. 规则要求如下&…

java 电子商务云平台b2b b2c o2o springmvc+mybatis+spring cloud+spring boot

2019独角兽企业重金招聘Python工程师标准>>> 大型企业分布式互联网电子商务平台,推出PC微信APP云服务的云商平台系统,其中包括B2B、B2C、C2C、O2O、新零售、直播电商等子平台。 技术解决方案 开发语言: java、j2ee 数据库&#xf…