深入理解mysql事务隔离级别

mysql支持4种事务隔离级别分别为

Read Uncommitted 读未提交

Read Committed 读已提交

Repeatable Read 可重复读 *注意这个概念容易混,下面细说

Serializable 串行化事务操作

1.Read Uncommitted 读未提交

事务隔离级别设为Read Uncommitted时,能查询到其他事务已修改但尚未提交的数据,若后续其他事务发生回滚,则造成了脏读。是最低的事务隔离级别

2.Read Committed 读已提交

事务隔离级别设为Read Committed时,就不会查询到其他事务已修改但尚未提交的数据了,读取的都是其他事务已提交过的数据,避免了脏读。

但是会出现一种新的问题 不可重复读问题 如下

在Read Committed 级别下开启一个事务,先执行

select * from books where name = “计算机原理”

查询到图书信息 包括图书的数量,采购价格等,但此时另外一个事务修改了该图书的数量,并且进行了提交,那么接下来第一个事务

再使用  select * from books where name = “计算机原理” 查询时会发现图书的数量发生了变化,出现了前后查询不一致的问题,即不可重复读问题

3.Repeatable Read 可重复读

事务隔离级别设为Repeatable Read可以避免不可重复读问题 但要注意 并不是禁止其他事务去修改,或者阻塞其他事务的更改,而是在该隔离级别下,同样的条件多次查询 使用的是一个快照,即第一次查询的结果,其他事务仍然可以对数据进行更改并提交。尽管使用的是快照结果但仍然可以保证事务的一致性,可通过如下方式进行验证

例如

事务A隔离级别设为Repeatable Read

开启事务A 查询 计算机原理图书的数量

select total  from books where name = “计算机原理”

total 值为20,

然后其他事务修改计算机原理图书数量为29并进行了提交,

事务A再次执行

select total  from books where name = “计算机原理”

total 值仍未20(上面有解释,这是一个快照)

事务A执行 更新操作

update books set total = total - 1 where name = "计算机原理"

再次查询 select total  from books where name = “计算机原理” 会发现total为28 保证了事务的一致性。

在Repeatable Read隔离级别下,仍然有新的问题,即幻读

幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。

4.Serializable 串行化事务操作

事务的最高隔离级别  可避免脏读,不可重复读,幻读

在该隔离级别下,开启事务 执行查询语句,在该查询范围内的数据如有其它事务进行更改或新增删除等,会被阻塞,强制依顺序执行事务,

例如

事务A隔离级别设为Serializable

开启事务 执行 select *from books where name = “计算机原理”

其它事务只要新增,更改,删除 name为“计算机原理”的行都会被阻塞强制按事务先后顺序执行,即事务A结束后,他们才能继续执行。

若事务A开启事务 执行 select *from books 则其它事务对这张表执行的增删改都会被阻塞,被迫按事务顺序执行,即事务A结束后,他们才能继续执行。

以上示例 都已在mysql上进行了验证 另外mysql事务默认隔离级别为Repeatable Read

原文地址:https://www.cnblogs.com/imfx/p/11269045.html

时间: 2024-10-04 19:43:02

深入理解mysql事务隔离级别的相关文章

查询mysql事务隔离级别

查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set session transaction isolatin level repeatable read; 4.设置系统当前隔离级别 s

Mysql事务-隔离级别

MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被视为一个不可分割的单元: 一致性(Consistency):数据库总是从一种状态切换到另一种状态: 隔离性(Isolation):通常来说,事务在提交前对于其他事务不可见: 持久性(Durablity):一旦事务提交,所做修改永久保存数据库: 事务最常用的例子就是银行转账.假设polo需给lynn转

MySQL事务隔离级别为"REPEATABLE-READ"下的"幻读"现象

MySQL事务隔离级别为"REPEATABLE-READ"下的"幻读"现象 关于mysql命令行中事务控制的语句见该文章:http://my.oschina.net/xinxingegeya/blog/296459 本片参考文章:http://blog.csdn.net/jiao_fuyou/article/details/16368827 http://www.cnblogs.com/hancf/archive/2012/08/28/2660422.html my

查询修改mysql事务隔离级别

1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set tx_isolation='read-committed'; 4.设置系统当前隔离级别 set global transaction isolation level read committed; 关于隔离级别的理解: 1.read uncommitted 可以看到未提交的数据(脏读),举个例子:别人说的话

理解MySql事务隔离机制、锁以及各种锁协议

一直以来对数据库的事务隔离机制的理解总是停留在表面,其内容也是看一遍忘一边.这两天决定从原理上理解它,整理成自己的知识.查阅资料的过程中发现好多零碎的概念如果串起来足够写一本书,所以在这里给自己梳理一个脉络,具体的内容参考引文或在网上搜一下.由于平时接触最多的是MySQL,所以文章中某些部分是MySQL特有的特性,请读者注意. 数据库并发操作会引发的问题: 多个事务同时访问数据库时候,会发生下列5类问题,包括3类数据读问题(脏读,不可重复读,幻读),2类数据更新问题(第一类丢失更新,第二类丢失更

MySQL事务隔离级别详解

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

深入理解mysql的隔离级别

建表插入测试数据A> create table test(id int ,num int) ;Query OK, 0 rows affected (0.53 sec) A> insert into test values(1,1);Query OK, 1 row affected (0.01 sec) A> insert into test values(2,2);Query OK, 1 row affected (0.00 sec) A> insert into test val

mysql -- 事务隔离级别以及java中事务提交的步骤

SQL标准定义了四种隔离级别,不同隔离的级别使用不当会出现脏读.不可重复读和幻读的问题,隔离级别的出现是事务处理效率与安全的一种平衡. 隔离级别不同会出现的问题 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据. 幻读(Phant

mysql事务隔离级别与锁的关系

其实操作了这么久mysql一直也没有把mysql中事务跟锁的关系弄得特别清楚.然后搜到美团这篇文章,顺便结合一下自己遇到的问题总结一下. 首先事务有四种隔离级别: Reference: http://tech.meituan.com/innodb-lock.html Innodb中的事务隔离级别和锁的关系