专栏首页Java小王子Java并发事务处理带来的问题与隔离级别
原创

Java并发事务处理带来的问题与隔离级别

并发事务处理带来的问题

  相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。

  1. 更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更新覆盖了由其他事务所做的更新。例如,两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改。如果在一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同一文件,则可避免此问题。“更新丢失”通常是应该完全避免的。但防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决,因此,防止更新丢失应该是应用的责任。
  2. 脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做"脏读"。
  3. 不可重复读(Non-Repeatable Reads):一个事务读取某些数据,在它结束读取之前,另一个事务可能完成了对数据行的更改。当第一个事务试图再次执行同一个查询,服务器就会返回不同的结果。
  4. 幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。 “脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。 数据库实现事务隔离的方式,基本上可分为以下两种。
  • 一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。
  • 另一种是不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本,因此,这种技术叫做数据多版本并发控制(MultiVersion Concurrency Control,简称MVCC或MCC),也经常称为多版本数据库。   数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上 “串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。   为了解决“隔离”与“并发”的矛盾,ISO/ANSI SQL92定义了4个事务隔离级别

4种事务隔离级别

隔离级别就是对对事务并发控制的等级 SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE 1、不带SESSION、GLOBAL的SET命令 只对下一个事务有效 2、SET SESSION 为当前会话设置隔离模式 3、SET GLOBAL 为以后新建的所有MYSQL连接设置隔离模式(当前连接不包括在内)

  • read uncommitted不提交的读: 即脏读,一个事务修改了一行,另一个事务也可以读到该行。 如果第一个事务执行了回滚,那么第二个事务读取的就是从来没有正式出现过的值。
  • read committed提交的读 即不可重复读,试图通过只读取提交的值的方式来解决脏读的问题,但是这又引起了不可重复读取的问题。 事务1在两次查询的过程中,事务2对该表进行了插入、删除操作,从而事务1第二次查询的结果发生了变化。(未加锁)
  • repeatable read(默认) 即可重复读,在一个事务对数据行执行读取或写入操作时锁定了这些数据行。

但是这种方式又引发了幻读的问题。

因为只能锁定读取或写入的行,不能阻止另一个事务插入数据,后期执行同样的查询会产生更多的结果。

  • serializable可串行化 事务被强制为依次执行。这是 SQL 标准建议的默认行为。

大多数的数据库系统的默认事务隔离级别都是:Read committed

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据库事务的ACID及隔离级别

    数据库事务的ACID及隔离级别 Mysql中的存储引擎 在mysql5.5后MySQL5.5以后默认使用InnoDB存储引擎,除InnoDB和BDB提供事务安全...

    企鹅号小编
  • mysql学习笔记(七)事务&批处理和JDBC的使用爬坑

    一个事务执行多个操作时,要么所有事务被提交,对数据库的操作成功。要么中途出现问题或者反悔回滚

    逆回十六夜
  • Java面试手册:数据库 ③

    南风
  • 2019数据库面试题:事务并发可能会导致哪些问题,mysql默认的是哪种级别,这种默认的隔离级别能够避免哪些问题?

    1、脏读:B事务读取到了A事务尚未提交的数据 2、不可重复读:一个事务中两次读取的数据的内容不一致 3、幻读/虚读:一个事务中两次读取的数据的数量不一致

    葆宁
  • MySQL 事务

      事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级...

    Demo_Null
  • MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)

    MySQL 事务主要用于处理操作量大,复杂度高的数据。 比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如...

    谙忆
  • 并发减库存,怎么保证不超卖?

    秒杀的场景有很多,比如:抢购、抢票、抢红包等等。总之,就是在极短时间内有大量的请求。

    Spark学习技巧
  • Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day7】 —— 数据库2(事务)

      本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架...

    陈哈哈
  • 程序员必知的六种隔离技术

    节选自《Growth: 全栈增长工程师指南》 为了将我们的应用部署到服务器上,我们需要为其配置一个运行环境。从底层到顶层有这样的运行环境及容器: 隔离硬件:虚拟...

    Phodal
  • Spring源码剖析8:Spring事务概述

    事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。

    Java技术江湖
  • 干货!Hibernate事务and并发问题处理

    1.事务介绍: 1.1.事务的定义: 事务就是指作为单个逻辑工作单元执行的一组数据操作,这些操作要么必须全部成功,要么必须全部失败,以保证数据的一致性和完整性。...

    企鹅号小编
  • 【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河
  • Innodb事务的一些概念

    事务是由一系列SQL组成的逻辑处理单元,要么全'部'执行,要么全'不'执行。事务具有四个属性,也就是常说的ACID属性,分别代表原子性,一致性,隔离性和...

    AsiaYe
  • 数据库的并发控制总结

    SuperHeroes
  • 关于MySQL的知识点与面试常见问题都在这里

    我自己总结的Java学习的一些知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailc...

    用户2164320
  • 高并发场景下的数据库事务调优

    数据库事务是访问可能操作各种数据项的一个数据库操作序列,这些操作要么全部成功,要么全部失败。提起事务,大家都知道ACID属性,这些特性在前边的文章里都有详细的讲...

    故里
  • 总结一套Java面试题送给大家

    最近面试的Coder们,你们对结果还满意吗?今天给大家总结下Java面试中常见的问题和应对策略,虽然可能好多人认为我把那些面试中常见的记下就行了,但你确定你真的...

    攻城狮的那点事
  • MySQL的可重复读级别能解决幻读吗

    之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测试复现这些问题。关于脏读和不可重复读在相应的隔离...

    本人秃顶程序员
  • 数据库事务的四大特性以及事务的隔离级别详解

    Tanyboye

扫码关注云+社区

领取腾讯云代金券