精华内容
下载资源
问答
  • 作者:伞U ...好久没碰数据库了,只是想起自己当时在搞数据库的...为了说明问题,我们打开两个控制台分别进行登录来模拟两个用户(暂且成为用户 A 和用户 B 吧),并设置当前 MySQL 会话的事务隔离级别。 一. read unco
  • MySQL事务隔离级别

    2019-03-21 01:54:28
    NULL 博文链接:https://cuishuangjia.iteye.com/blog/964885
  • MySQL事务隔离级别详解,这个面试经常会面到,必会呀,哈哈
  • 查看事务隔离级别MySQL 中,可以通过show variables like ‘%tx_isolation%’或select @@tx_isolation;语句来查看当前事务隔离级别。 查看当前事务隔离级别的 SQL 语句和运行结果如下: mysql> show variables ...
  • 主要介绍了Mysql事务隔离级别原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • mysql事务隔离级别

    千次阅读 2019-06-01 08:13:07
    隔离级别 MySQL是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session)。我们可以同时在不同的会话里输入各种语句,...

    隔离级别

    MySQL是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session)。我们可以同时在不同的会话里输入各种语句,这些语句可以作为事务的一部分进行处理。不同的会话可以同时发送请求,也就是说服务器可能同时在处理多个事务,这样子就会导致不同的事务可能同时访问到相同的记录。我们前边说过事务有一个特性称之为隔离性,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样子的话对性能影响太大,所以设计数据库的大叔提出了各种隔离级别,来最大限度的提升系统并发处理事务的能力,但是这也是以牺牲一定的隔离性来达到的。

    未提交读(READ UNCOMMITTED)脏读

    如果一个事务读到了另一个未提交事务修改过的数据,那么这种隔离级别就称之为未提交读(英文名:READ UNCOMMITTED),示意图如下:

     

     

    如上图,Session ASession B各开启了一个事务,Session B中的事务先将id1的记录的列c更新为'关羽',然后Session A中的事务再去查询这条id1的记录,那么在未提交读的隔离级别下,查询结果就是'关羽',也就是说某个事务读到了另一个未提交事务修改过的记录。但是如果Session B中的事务稍后进行了回滚,那么Session A中的事务相当于读到了一个不存在的数据,这种现象就称之为脏读,就像这个样子:

    脏读违背了现实世界的业务含义,所以这种READ UNCOMMITTED算是十分不安全的一种隔离级别

    已提交读(READ COMMITTED)不可重复读

    如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那么这种隔离级别就称之为已提交读(英文名:READ COMMITTED),如图所示:

     

    从图中可以看到,第4步时,由于Session B中的事务尚未提交,所以Session A中的事务查询得到的结果只是'刘备',而第6步时,由于Session B中的事务已经提交,所以Session B中的事务查询得到的结果就是'关羽'了。

    对于某个处在在已提交读隔离级别下的事务来说,只要其他事务修改了某个数据的值,并且之后提交了,那么该事务就会读到该数据的最新值,比方说:

     

    image_1d6urs4l0g799959e1jsj1cvqai.png-170.6kB

     

     

    我们在Session B中提交了几个隐式事务,这些事务都修改了id1的记录的列c的值,每次事务提交之后,Session A中的事务都可以查看到最新的值。这种现象也被称之为不可重复读

    可重复读(REPEATABLE READ)mysql默认的隔离级别

    在一些业务场景中,一个事务只能读到另一个已经提交的事务修改过的数据,但是第一次读过某条记录后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种隔离级别就称之为可重复读(英文名:REPEATABLE READ),如图所示:

     

    image_1d6useq9aagi9981sm21b011dt4bf.png-171.1kB

     

     

    从图中可以看出来,Session A中的事务在第一次读取id1的记录时,列c的值为'刘备',之后虽然Session B中隐式提交了多个事务,每个事务都修改了这条记录,但是Session A中的事务读到的列c的值仍为'刘备',与第一次读取的值是相同的。

    串行化(SERIALIZABLE)幻读

    如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,那就意味着发生了幻读,示意图如下:

     

    如上图,Session A中的事务先根据条件number > 0这个条件查询表hero,得到了name列值为'刘备'的记录;之后Session B中提交了一个隐式事务,该事务向表hero中插入了一条新记录;之后Session A中的事务再根据相同的条件number > 0查询表hero,得到的结果集中包含Session B中的事务新插入的那条记录,这种现象也被称之为幻读

    有的同学会有疑问,那如果Session B中是删除了一些符合number > 0的记录而不是插入新记录,那Session A中之后再根据number > 0的条件读取的记录变少了,这种现象算不算幻读呢?明确说一下,这种现象不属于幻读幻读强调的是一个事务按照某个相同条件多次读取记录时,后读取时读到了之前没有读到的记录

    小贴士: 那对于先前已经读到的记录,之后又读取不到这种情况,算啥呢?其实这相当于对每一条记录都发生了不可重复读的现象。幻读只是重点强调了读取到了之前读取没有获取到的记录。

     

    展开全文
  • 查询mysql事务隔离级别

    千次阅读 2019-10-11 16:37:59
    3、事务隔离级别越高,越能保证数据的完整性,但是对并发性能影响大,就比如隔离级别为串行化时,读取数据会锁住整张表。 4、不可重复读和幻读很相似,两者整体上都是两次读的数据不相同,但是不可重复读一般时更新...
    转载链接: https://blog.csdn.net/zhuoya_/article/details/80299250

    点击>>MySQL下的存储引擎查看MySQL下的几种存储引擎。在几种存储引擎中,可以看到只有InnoDB存储引擎支持事务,那么本篇就来介绍InnoDB下支持的事务。

    本篇目录

    **************************************************************

    *     事务是什么?                                                                   *

    *     事务遵循的四个特性  (AICD)                                        *

    *     事务中的基本操作                                                            *

    *     事务的四中隔离级别                                                         *

    *     通过设置隔离级别来保证事务的隔离性基本操作                *

    **************************************************************

    一、事务(transaction)

    事务指的就是一种SQL语句的集合。

    二、事务的四个特性


    事务的原子性通过Undo log来保证。(Undo日志记录数据修改前的状态)

    事务的持久性通过Redo log来保证。(Redo日志记录某数据块被修改后的值)

    事务的隔离性通过设置隔离级别来保证。

    事务的一直性通过Redo log来保证。

    三、事务中的基本操作

    (1)回滚:撤销指定SQL语句的功能。

    mysql>rollback;

    (2)提交:将未存储的SQL语句结果写到数据库表中。

    mysql>commit;

    (3)保留点:事务处理中设置的临时占位符。

    mysql>savepoint   XXX;

    注意点:

    1、不能回退select、create和drop语句。

    2、事务提交是默认提交。每执行一条语句就把该语句当成一个事务进行提交。

    3、当出现start transaction;语句时,隐式提交会关闭。

    4、当rollback或者commit语句出现,事务自动关闭,隐式提交自动恢复。

    5、通过设置autocommit=0可以取消自动提交,直到看到autocommit=1才会提交。

    6、如果没有设置保留点,rollback会回滚到start transaction处;如果设置了,并且在rollback指定了该保留点,则回滚到保留点(rollback to XXX)。

    四、事务的四中隔离级别

    在MySQL中有四中隔离级别。每一种隔离级别的作用也不同,下面通过一张表来看一下:

    事务的隔离级别 /  问题脏读不可重复读幻读
    未提交读(read uncommitted)没有避免没有避免没有避免
    已提交读(read committed)已避免没有避免没有避免
    可重复读(repeatable read)已避免没有避免没有避免
    可串行化/可序列化(serializable)已避免已避免

    已避免

    在MySQL中默认的隔离级别是可重复读


    五、设置隔离级来保证事务的隔离性

    该部分结合并发中出现的脏读、不可重复读和幻读来操作。

    (1)

    什么是脏读?


    案例一:未提交隔离级别无法避免脏读。

    a.客户端A开启事务,查询账户余额。


    b.在事务A未提交之前,开启客户端B,更新LIMing的账户余额。


    c.在事务B未提交时,在客户端A查询表中数据,看到了事务B更新的数据。


    d.此时,如果事务B因某些原因需要进行回滚,则所有操作被撤销,A中读到的数据就是脏数据。


    二、

    什么是不可重复读?


    案例二:已提交读避免了脏读,无法避免不可重复读。

    a.客户端A开启事务,查询表中数据。


    b.在事务A还没有提交,开启事务B,更新表中ShangGuan的账户余额。


    c.在事务A中查看ShangGuan的账户余额。余额未该变,说明杜绝了脏读。


    d.事务B提交。


    在事务A中查询账户余额,发生该变。对于开发者来说保证了数据的一致性。但是对于用户来说,两次的读取结果不一样,发生了不可重复读。


    三、

    案例三:可重复读隔离级别避免了不可重复读,但是数据任然保持一致性。

    a.设置隔离级别为可重复读,开启事务A,查询最初的账户余额。


    b.在事务A未提交时,开启事务B,更新表中LiHong的账户余额。


    c.事务B未提交时,在事务A中查询表。发现没有发生变化,避免了不可重复读。


    d.紧接着,在事务A中对LiHong的账户余额做计算,会发现把在事务B中的结果拿来用,在开发人员看来保证了事务的一致性。


    四、

    什么是幻读?


    案例四、可重复读隔离级别下的幻读

    a.在客户端A中开启事务,查询表中数据。


    b.A事务为提交,在客户端B中开启事务,向表中插入一条数据。


    c.在客户端A中计算表中账户余额总和。


    经过操作发现在RPEATABLE-READ隔离级别下并没有发生幻读现象?????

    问号脸,什么原因。

    我查了一下表的存储引擎,如下,是InnoDB存储引擎:


    再查一下,数据库存储引擎


    我忘记了在Linux下的MySQL存储引擎默认是MyISAM存储引擎,它对于非索引项会加表锁。所以查询没出现幻读可能就是这个原因吧。

    在网上查了一下,设置默认存储引擎为InnoDB步骤有:在/etc/my.cnf中,在mysqld后面增加default-storage-engine=INNODB即可。在这儿偷个懒就不验证了。

    五、

    可串行化隔离级别:

    a.在客户端A下设置隔离级别,开启事务。


    b.在A事务未提交时,开启B事务,设置隔离级别,进行插入数据,发现不允许


    ************************************************************************************************************

    总结:

    1、以上操作版本是:

    2、事务的隔离性可通过设置隔离级别来保证。

    3、事务隔离级别越高,越能保证数据的完整性,但是对并发性能影响大,就比如隔离级别为串行化时,读取数据会锁住整张表。

    4、不可重复读和幻读很相似,两者整体上都是两次读的数据不相同,但是不可重复读一般时更新引起的;幻读是插入和删除引起的。

    ***************************************************************************************************************

    展开全文
  • 查看mysql 事务隔离级别 mysql> show variables like '%isolation%'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | tx_isolation | READ-COMMITTED | +---...
  • Mysql事务隔离级别

    千次阅读 2020-07-05 11:49:16
    事务A在事务B提交之后重复读的数据依旧是正常的数据,这个Mysql默认的事务隔离级别就解决了不可重复读的问题 如果,我们在事物A中再次进行更新操作,还是执行在session b中的语句balance的结果应该是多少呢 update ...

    1.1 锁的分类

    从性能上分为乐观锁和悲观锁

    1.1.1 乐观锁

    通过版本控制来实现:在表中加个字段,每次操作完成之后对版本进行更新。解决了多个线程同时操作时数据覆盖的问题,在性能上稍快

    1.1.2 悲观锁

    多个线程同时执行时,实际上是有个等待的过程,后面到的线程需要等待前面的资源执行完成,在性能上稍差
    从对数据库操作的类型分:读锁和写锁
    从粒度:表锁和行锁

    读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
    写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁

    1.2 三把锁

    1.2.1 表锁(偏度)

    表锁偏向myIsam存储引擎,开销小,加锁快,发生锁冲突的概率高

    Myisam:支持表锁
    innodb:支持行锁

    1.2.1.1 基本操作

    建表并插入数据

    DROP TABLE IF EXISTS `locktest`;
    CREATE TABLE `locktest` (
      `id` int(11) NOT NULL,
      `name` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    INSERT INTO `locktest` VALUES ('1', 'zhangsan');
    INSERT INTO `locktest` VALUES ('2', 'lisi');
    INSERT INTO `locktest` VALUES ('3', 'gaowz');
    
    

    手动增加表锁

    lock table 表名称 read(write);
    

    查看表上加过的锁

    show open tables;
    

    删除表锁

    unlock tables;
    
    1.2.1.2 案例分析(加读锁)
    lock table locktest read;
    

    当前session和其他session都可以读该表
    当期session中插入或者更新锁定的表都会报错,其他session插入或更新则会等待

    1)对Session A 加表锁,在其他Session B中执行更新语法,我们可以看到此时sql出于阻塞状态
    2)Session A 中执行更新语法,这里直接给出报错提示(乐观锁)

    在这里插入图片描述
    3)释放Session A中的表锁,Session B的sql语句自动提交(悲观锁)
    在这里插入图片描述

    加写锁

    当前session对改表的增删改查都没有问题,其他session对改表所有操作都被阻塞,写锁实际上是排它锁,会将其他session的一切操作排除在外
    1) 在Session A对表加写锁,我们会发现在Session B中对该表的操作都会被阻塞
    2) 在Session A中释放该表锁,SessionB中的sql才可以执行
    在这里插入图片描述
    结论:
    由于MyISam在执行查询语句前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加读锁
    1、对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
    2、对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作
    读锁会阻塞写,但是不会阻塞读;写锁会把读和写都堵塞

    1.3 行锁(偏写)

    行锁偏向Innodb存储引擎,开销大、加锁慢,会出现死锁,锁粒度最小,发生锁冲突的概率最低,并发度也最高。InnoDB与MyISAM的最大的不同有两点:一是支持事务;二是使用了行级锁、

    1.3.1 行锁支持事务
    • 事务
      事务是由一组SQL语句组成的逻辑处理单元,事务具有四个属性(ACID)
      原子性(Automicty):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行
      一致性(Consistent): 在事务开始和完成时,数据都必须保持一致状态。这意味着素有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
      隔离性(lsolation): 数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的
      持久性(Durable) :事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

    • 并发事务处理带来的问题
      1) 更新丢失(Lost Update)
        当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题–最后的更新覆盖了由其他事务所做的更新。
      2)脏读(Dirty Reads)
        一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致的状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此作进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象的叫做“脏读”。
        一句话:事务A读取到了事务B已经修改但尚未提交的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。
      3)不可重读(Non-Repeatable Reads)
        一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。
        一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性
      4)幻读(Phantom Reads)
        一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。
        一句话:事务A读取到了事务B提交的新增数据,不符合隔离性
        
      脏读是事务B里面修改了数据
      幻读是事务B里面新增了数据

    • 事务隔离级别
      脏读、不可重复读和幻读,都是数据库读一致性问题,必须由数据库提供一定的事务隔离截止来解决

    隔离级别脏读不可重复读幻读
    读未提交可能可能可能
    读已提交不可能可能可能
    可重复读不可能不可能可能
    可串行化不可能不可能不可能

    数据库的事务隔离越严格,并发副作用越小,但付出的代价也越大,因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。
    同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读"和“幻读”并不敏感,可能更关心数据并发访问的能力。
    常看当前数据库的事务隔离级别: show variables like ‘tx_isolation’;
    **设置事务隔离级别:set tx_isolation=‘REPEATABLE-READ’;
    SET session TRANSACTION ISOLATION LEVEL Read uncommitted **

    1.3.2 隔离级别案例分析
    DROP TABLE IF EXISTS `account`;
    CREATE TABLE `account` (
      `id` int(11) NOT NULL,
      `name` varchar(255) DEFAULT NULL,
      `balance` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `account` VALUES ('1', '张三', '100');
    INSERT INTO `account` VALUES ('2', 'gaowz', '10000');
    INSERT INTO `account` VALUES ('3', 'lisi', '3000');
    

    1) 读未提交
    打开一个客户端A,并设置当前事务模式为read uncommited(未提交读),查询表account的初始值:

    • 设置隔离级别
    set tx_isolation='read-uncommitted';
    

    在这里插入图片描述
    在两个session中都设置隔离级别为读未提交,我们会发现Session A 中插入的语句事务未提交,在Session B中依然可以看到

    • 如果Session A 在回滚之前Session B已经对数据进行修改并进行提交,那么过程中读取的就是脏数据,如下所示,Session A 回滚应该是将数值回滚到100,但实际上是变成了500。
      在这里插入图片描述
      针对这个问题我们可以采用读已提交的事务隔离级别
      2) 读已提交
      打开一个客户端A,并设置当前事务的模式为read commit (未提交),查询表account所有记录

    • 设置隔离级别

     set tx_isolation='read-committed';
    

    此时在Session A 中修改balance的值为400,我们发现在Session B中的balance依然是500
    在这里插入图片描述
    此时如果我们仍然要对此数据进行修改,可以看到会将当前的事务阻塞,只有等到Session A 中事务提交之后,Session B中的事务才可以继续向下执行
    在这里插入图片描述
    读已提交虽然解决了脏读的问题,但是没有解决不可重复读的问题——事务A读取到了事务B已经提交的修改的数据

    例:事务A 读取了数据500,并进行了一系列的运算操作,在对500更新之前需要重新查询一次500这个数据,如果此时,事务A同样对500这个数据进行了修改,并进行了提交,那事务A中就读到了事务B中已提交修改的数据,那这种情况就不符合正常的逻辑。如下图所示:
    在这里插入图片描述
    3) 可重复读
    打开一个客户端A,并设置当前事务模式为repeatable read,查询表account的所有记录

    • 设置隔离级别
     set tx_isolation='repeatable-read';
    

    事务A在事务B提交之后重复读的数据依旧是正常的数据,这个Mysql默认的事务隔离级别就解决了不可重复读的问题
    在这里插入图片描述
    如果,我们在事物A中再次进行更新操作,还是执行在session b中的语句balance的结果应该是多少呢

    update account set balance = balance -50 where id =1;
    

    按照正常的逻辑来说此时balance的值应该是200-50 = 150,但实际上是100.
    这是因为Mysql可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。这个情况就是幻读的问题,所以我们说,可重复读不可以解决换读的问题
    在这里插入图片描述
    接下来我们再次来验证一下幻读的问题:
    首先在事务B中插入一条数据并提交事务,接下来在事务A中查询这条数据,我们发现没有查询到这条数据,接下来再对这条数据进行更新操作,并重新查询,这样我们就可以查询到这条数据
    在这里插入图片描述
    注:这里在对balance字段操作时没有直接给字段赋值,这种方式可以通过数据库自带的锁,来帮助我们拿到的是最新的数据

    解决幻读的问题只需要将事务的隔离级别设置为串行化即可
    4) 串行化
    打开一个客户端A,并设置当前事务模式为serializable,查询表account的初始值
    因为这种隔离级别并发性非常低,所以一般不会用到,在这里便不再演示

    set tx_isolation='serializable';
    

    Mysql默认的是可重复读,如何解决幻读的问题
    间隙锁在一定程度上可以解决这个问题:
    我们如果要在事务A中更新某条数据,那可以使用间隙锁,那么其他的事务将无法插入这个范围内的数据,所以可以再一定程度上避免幻读。

    update account set name = 'ceshi' where id > 1 and id <=6;
    
    1.3.4 总结

    优点:
    Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一下,但是在整体并发处理能力方面要远远优于MYISAM的表级锁定的。当系统并发量高的时候,Innodb的整体性能和MYISAM相比有明显的的优势
    缺点:
    由于其粒度小,加锁时间慢,当我们使用不当时可能会让Innodb的整体性能表现不仅不能比MYISAM高,甚至可能会更差

    1.3.5 优化小技巧
    • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
    • 合理设计索引,
    • 尽量缩小锁的范围 尽可能减少检索条件,避免间隙锁
    • 尽量控制事务大小,减少锁定资源量和时间长度
    • 尽可能低级别事务隔离
    展开全文
  • 揭秘Mysql事务隔离级别之可重复读1.可重复读的来源2.何为不可重复读3.那么可重复读和不可重复读究竟有什么关系呢?4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序)。4.1.读已提交级别:4.2.可重复读...

    1.可重复读的来源

    知其源可以知其流,而因其流亦可溯其源,欲搞清楚什么是可重复读,必先知道可重复读是怎么来的的,这就引出了不可重复读。

    2.何为不可重复读

    老师说过,了解一项技术或搞懂一个名词的最佳方法是百度百科,因此献上百度百科:
    在这里插入图片描述
    注意划线部分,这是重点,敲黑板啦!!!
    “在一个事务内”,“在这个事务还没有结束时”。那么问题来了,究竟如何才能做到在一个事务内呢?
    这个答案,多亏了培训的老师:在mysql中,事务是自动提交的,要想设置事务不自动提交,就得开启一个事务:start transaction;,然后,在这段代码之后,commit提交事务之前,里面的多条DQL,DML,DDL语句都算在一个事务里面,同时没有使用commit提交事务,事务就没有结束。

    3.那么可重复读和不可重复读究竟有什么关系呢?

    答案揭晓:可重复读就是为了解决不可重复。乍一看不可重复读不是个好现象。有百度百科可以知道,假如有两个线程(打开两个mysql客户端模拟两个线程),线程1使用start transaction;后多次使用select语句查询某条记录,我们希望的是在事务结束之前,同样的select语句查询同一条记录不会发生改变,但是,如果你的数据库设置的隔离级别不是可重复读而是读已提交或者更低一级的读未提交,那么当另一个线程2使用update,delete等修改线程1要查询的那条记录的时候,在线程1事务结束之前使用同样的select语句查询同一条记录就会发生改变,这就是不可重复读现象。而当数据库设置的隔离级别是可重复读时,就不会出现不可重复读现象,即在线程1事务结束之前使用同样的select语句查询同一条记录不会发生改变。
    相关文章

    4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序)。

    4.1.读已提交级别:

    线程2:
    查看数据库的隔离级别:
    在这里插入图片描述
    更改数据库隔离级别:
    在这里插入图片描述
    查询某条记录:
    在这里插入图片描述
    线程1使用exit再重新使用mysql -u用户名 -p密码登录,避免缓存干扰实验结果,第二个实验同此操作。
    线程:1:开启事务(关闭事务自动提交)
    在这里插入图片描述
    线程2:
    在这里插入图片描述
    线程1:事务未结束,结果被更新
    在这里插入图片描述
    查询后再使用commit结束事务。

    继续使用上一个实验的用例。

    4.2.可重复读级别:

    线程2:
    在这里插入图片描述
    在这里插入图片描述
    线程1:
    在这里插入图片描述
    线程2:
    在这里插入图片描述
    在这里插入图片描述
    线程1:事务结束之前,结果仍未改变
    在这里插入图片描述

    5.总结

    实验成功,可重复读隔离级别解决不可重复现象证明成功。

    不太明白事务隔离级别的参考以下文章:
    MySQL事务和锁机制小白专场
    东软大三上学期实训笔记-mysql篇Day4

    展开全文
  • mysql事务隔离级别案例讲解

    千次阅读 2020-10-13 11:07:19
    查看当前事务隔离级别 select @@tx_isolation; A客户端 B客户端开启事务,A客户端查询数据, B客户端 start transaction; update account set money=5000 where name="aaa"; B客户端执行修改操作,不提交...
  • 由于Mysql 默认的隔离级别是...本文只介绍事务隔离级别相关的特性 违反事务隔离级别的几个特征 首先需要了解一下违反事物隔离级别的几个特征: 脏读 当前事务中读取到了其它没有提交的事务修改的数据———读.
  • 近来需要学习的东西实在太多了,看了容易忘记。准备写个blog记录下,方便以后复习。本文主要是讲解mysql事务隔离级别和不同级别所出现的问题。
  • 面试官:“讲讲mysql有几个事务隔离级别?” 你:“读未提交,读已提交,可重复读,串行化四个!默认是可重复读” 面试官:“为什么mysql选可重复读作为默认的隔离级别?” (你面露苦色,不知如何回答!) 面试官:...
  • 1、脏读、幻读、不可重复读示例;2、MySQL中的四种事务隔离级别
  • MySQL事务隔离级别和MVCC (绝对看得懂)

    万次阅读 多人点赞 2019-03-29 22:12:37
    来自一本MySQL小册子,讲得很好,值得收藏! 为了故事的顺利发展,我们需要创建一个表: CREATE TABLE t ( id INT PRIMARY KEY, c VARCHAR(100) ) Engine=InnoDB CHARSET=utf8; 然后向这个表里插入一条...
  • 一文看懂 MySQL事务隔离级别与锁

    千次阅读 多人点赞 2018-04-10 20:32:55
    事务隔离级别MySQL仅InnoDB引擎支持事务,所以也只有InnoDB有事务隔离级别) Read Uncommit (未提交读。允许脏读) 事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字...
  • 事务隔离级别介绍 隔离级别 脏读 不可重复读 幻读 未提交读(Read uncommitted) 可能 可能 可能 已提交读(Read committed) 不可能 可能 可能 可重复读(Repeatable read)...
  • SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(读取未提交内容)  ...
  • 1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。 2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不...
  • 根据实际需求,通过设置数据库的事务隔离级别可以解决多个事务并发情况下出现的脏读、不可...数据库不同,其支持的事务隔离级别亦不相同:MySQL数据库支持上面四种事务隔离级别,默认为Repeatable read;Oracle 数...
  • mysql 事务隔离级别.pdf

    2021-08-26 15:13:00
    mysql 事务隔离级别.pdf
  • MySQL事务隔离级别实现原理

    千次阅读 2018-12-27 22:38:51
    MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里讨论的事务隔离级别指的是MySQL InnoDB下的事务隔离级别,一般而言,隔离级别分为:读未提交:一个事务可以读取到另一个事务未提交的修改。这会带来脏读、幻...
  • mysql 事务隔离级别

    千次阅读 2012-12-26 11:47:58
    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。本文将以具体的例子来讲解这4类隔离级别。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,742
精华内容 36,296
关键字:

mysql事物隔离级别

mysql 订阅