事务并发之隔离级别

事务

事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。

事务并发

数据库是多个用户(事务)共享的,当多个用户同时访问数据时,那么在这种情况下就叫做并发。

事务并发下可能出现的问题

更新丢失

两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

脏读

一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚。

不可重复读

一个事务对同一行数据重复读取两次,但是却得到了不同的结果。

幻读

幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。

事务的隔离级别

读未提交

当前事务可以读取另一个事务未提交的记录,非常危险,因为另一个事务可能完全回滚!

读已提交

保证一个事务修改的数据提交后才能被另外一个事务读取。

可重复读

这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读!

序列化

事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

LBCC-隔离级别

读未提交

不加任何锁

读已提交

读数据加共享锁 
更改数据加排他锁 
共享锁读完立即释放

可重复读

读数据加共享锁 
更改数据加排他锁 
共享锁事务结束才释放

序列化

读数据加共享锁 
更改数据加排他锁 
共享锁事务结束才释放 
增加范围锁

什么鬼?可重复读和读已提交两种隔离级别得出的结论跟LBCC协议不一致!!!怀疑人生中……

MVCC协议

MVCC–多版本并发控制协议

通过保存数据在某个时间点的快照来实现,也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。不同的存储引擎MVCC的实现是不同的,典型的有乐观并发控制和悲观并发控制。

MVCC实现原理(Innodb引擎)

Innodb引擎会为每一行添加两个隐藏的列来实现的,分别表示该行创建版本和删除版本,创建版本是事务的版本号,每开始一个新的事务,版本号会自动递增。

举个栗子,偷几张图...

初始化数据

事务1

事务2

读已提交

读事务每次都读取undo log中最近的版本,因此两次对同一字段的读可能读到不同的数据(幻读),但能保证每次都读到最新的数据

可重复读

每次都读取指定的版本,这样保证不会产生幻读,但可能读不到最新的数据

总结

  1. 对于许多SQL,隔离级别越高,InnoDB给记录集加的锁就越严格,产生锁冲突的可能性就越高,从而对并发事务处理性的影响也就越大。
  2. 因此我们在项目中,应该尽量使用较低的隔离级别,以减少锁争用的几率。
  3. InnoDB引擎尽量使用索引,防止锁表。
  4. 合理使用事务的大小,小事务发生锁冲突的几率也更小。
  5. 尽量使用相等条件,避免Next-key锁对并发插入的影响(gap锁)

参考

  1. 高性能Mysql
  2. 深入浅出Mysql
时间: 2024-11-05 04:51:38

事务并发之隔离级别的相关文章

MySQL事务四个隔离级别

MySQL事务隔离级别详解             MySQL数据结构SQL SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted (读取未提交的内容)  在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Commit

数据库事务中的隔离级别和锁+spring Transactional注解

数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题. ACID 首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做,不能只做一部分:一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏:比如我们做银行转账的相关业务,A转账给B,要求

数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别

本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执

SqlServer——事务—锁与隔离级别

隔离实际上是通过锁来实现的,作用于整个事务,它通常在事务开始前指定,如 SET TRANSACTION ISOLATION LEVEL READ Committed,指定后面的事务为 已提交读:而锁是在我们执行某一具体的SQL语句时在from中指定锁模式来实现的,它可以覆盖掉已指定隔离级别下应用的锁类型.隔离级别牺牲并发性来实现一致性. 并发:是指在相同的时间,多个用户访问相同的数据.它通常引起以下问题:脏读:丢失更新:不可重复度:幻读: 脏读:一个进程读取了另一个进程尚未提交的数据. 不可重复

C# 事务的ACID隔离级别

事务的ACID属性如下: 原子性(Atomicity):事务的所有操作是原子工作单元:对于其数据修改,要么全都执行,要么全都不执行.原子性消除了系统处理操作子集的可能性. 一致性(Consistency):数据从一种正确状态转换到另一种正确状态.事务在完成时,必须使所有的数据都保持一致.在相关数据库中,所有规则都必 须应用于事务的修改,以保持所有数据的完整性.当事务结束时,所有的内部数据结构都必须是正确的.在存款取款的例子中,逻辑规则是,钱是不能凭空产生或销 毁的,对于每个(收支)条目必须有一个

数据库事务特性和隔离级别

事务 一组业务操作,要么全部成功,要么全部不成功. ----------------事务的特性-------------- 原子性:一个事务是一个整体,不可分割,事务中的操作要么都成功,要么都失败. 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态.事务执行前后,数据库的状态是一致的. 例如:A有1000,元,B有1000元,加起来是2000,中间执行转账的操作,转账后两个人的钱加起来还是2000. 隔离性:两个或多个事务并发操作,之间会互相影响.数据库提供了隔离级别来消除这些影响

数据库 之 事务控制和隔离级别

1  概述 事务是指一组原子性的SQL查询.或者是一个或多个SQL语句组成的独立工作单元:MyISAM不流行的原因很大是因为其不支持事务的处理功能. 2  事务日志 事务日志定义属性,有些参数可以运行时修改,写入在配置段里,事务日志相当于是中间的辅助功能,而且很关键. 事务日志表示把操作过程一笔一笔记录下来.如某个线程要对某个行操作,数据库会先保留老版本于事务日志中,对文件的写入,新版本的内容是先写入到日志里,提交前,数据在日志文件中,而不是在数据文件中,提交操作执行后,才将新旧版本的日志清除.

spring的事务传播与隔离级别等相关配置

<!-- 配置通知 --> //   脏读  :一个事务读到了另一个事务的未提交的数据 //  不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致. //  虚幻读  :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致. 事务的传播行为: * 保证同一个事务中 PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认) PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用

事务管理、隔离级别,日志管理

事务Transactions:一组原子性的SQL语句,或一个独立工作单元事务日志:记录事务信息,实现undo,redo等故障恢复功能ACID特性:A:atomicity原子性:整个事务中的所有操作要么全部成功执行,要么全部失败后回滚C:consistency一致性:数据库总是从一个一致性状态转换为另一个一致性状态I:Isolation隔离性:一个事务所做出的操作在提交之前,是不能为其它事务所见:隔离有多种隔离级别,实现并发D:durability持久性:一旦事务提交,其所做的修改会永久保存于数据