精华内容
下载资源
问答
  • MySQL 事务 隔离级别

    千次阅读 2021-01-23 13:34:28
    MySQL 事务 隔离级别

    MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的

    数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,只要有一步失败,就要回滚所有操作。

    事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID,缺一不可。

    事务隔离级别要实际解决的问题

    脏读

    脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并不一定最终存在的数据,这就是脏读。

    不可重复读

    不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。

    幻读

    幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。

    事务隔离级别

    SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:

    1. 读未提交(READ UNCOMMITTED)
    2. 读提交 (READ COMMITTED)
    3. 可重复读 (REPEATABLE READ)
    4. 串行化 (SERIALIZABLE)

    从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,可重复读是 MySQL 的默认级别。

    下面展示了 4 种隔离级别对这三个问题的解决程度。

    只有串行化的隔离级别解决了全部这 3 个问题,其他的 3 个隔离级别都有缺陷。

    读未提交和串行化基本上是不需要考虑的隔离级别,前者不加锁限制,后者相当于单线程执行,效率太差。

    读提交解决了脏读问题,行锁解决了并发更新的问题。并且 MySQL 在可重复读级别解决了幻读问题,是通过行锁和间隙锁的组合 Next-Key 锁实现的。

    MySQL 中执行事务

    事务的执行过程如下,以 begin 或者 start transaction 开始,然后执行一系列操作,最后要执行 commit 操作,事务才算结束。当然,如果进行回滚操作(rollback),事务也会结束。

    展开全文
  • MySQL事务隔离级别

    2019-10-22 14:36:09
    MySQL事务隔离级别 事务隔离级别 ​ 事务隔离级别指的是在处理同一个数据的多个事务中,一个事务修改数据后,其他事务何时能看到修改后的结果。数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、...

    MySQL事务隔离级别

    1. 事务隔离级别

      ​ 事务隔离级别指的是在处理同一个数据的多个事务中,一个事务修改数据后,其他事务何时能看到修改后的结果。数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。

    2. 脏读,幻读,不可重复读
      1. 脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

      2. 不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容),例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

      3. 幻读:是指当事务不是独立执行时发生的一种现象,例如:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象
        发生了幻觉一样。

    3. MySQL数据库事务隔离级别主要有四种:
      • Serializable:串行化,一个事务一个事务的执行。是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

      • Repeatable read:重复读,无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响,可以避免不可重复读,但还有可能出现幻读 ;

      • Read committed:读取已提交,其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值,避免了脏读,但是可能会造成不可重复读;

      • Read uncommitted:读取未提交,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值,就可能出现脏读;

      • MySQL数据库默认使用可重复读( Repeatable read)。

    4. 修改MySQL数据库事务隔离级别
      1. 场景

        ​ 使用乐观锁的时候,如果一个事务修改了库存并提交了事务,那其他的事务应该可以读取到修改后的数据值,所以不能使用可重复读的隔离级别,应该修改为读取已提交(Read committed)。

      2. 修改方式(ubuntu为例)

        # 修改配置文件
        cd /etc/mysql/mysql.conf.d/
        sudo vim mysqld.cnf
        
        # 添加以下代码
        transaction-isolation=READ-COMMITTED
        
    展开全文
  • MYSQL事务隔离级别

    2015-04-23 23:48:56
    一、MYSQL事务隔离级别 MYSQL事务隔离级别支持: read uncommitted(未提交读) read committed(已提交读) repeatable read(可重复读) serializable(可串行化) MYSQL默认的隔离级别是repeatable read。 二、...

    一、MYSQL事务隔离级别

    MYSQL事务隔离级别支持:

    read uncommitted(未提交读)

    read committed(已提交读)

    repeatable read(可重复读)

    serializable(可串行化)

    MYSQL默认的隔离级别是repeatable read。

    二、隔离级别设置

    查看MYSQL的隔离级别:

    select @@tx_isolation;

    设置MYSQL的隔离级别:

    设置innodb的事务级别方法是:set 作用域 transaction isolation level 事务隔离级别;

    其中,事务隔离级别,可选:

    read uncommitted
    read committed
    repeatable read
    serializable
    

    例如:

    set global transaction isolation level read committed; //全局的
    set session transaction isolation level read committed; //当前会话
    

    锁机制:
    共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写

    排它锁:由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁,典型是mysql事务中

    锁的范围:

    行锁: 对某行记录加上锁

    表锁: 对整个表加上锁

    这样组合起来就有,行级共享锁,表级共享锁,行级排他锁,表级排他锁

    read uncommitted隔离级别,当两个事务同时进行时,即使事务没有提交,所做的修改也会对事务内的查询做出影响,这种级别显然很不安全。但是在表对某行进行修改时,会对该行加上行共享锁;

    read committed事务隔离级别,只有在事务提交后,才会对另一个事务产生影响,并且在对表进行修改时,会对表数据行加上行共享;

    repeatable read事务隔离级别,当两个事务同时进行时,其中一个事务修改数据对另一个事务不会造成影响,即使修改的事务已经提交也不会对另一个事务造成影响。

    在事务中对某条记录修改,会对记录加上行共享锁,直到事务结束才会释放。

    serializable事务隔离级别最严厉,在进行查询时就会对表或行加上共享锁,其他事务对该表将只能进行读操作,而不能进行写操作。


    参考:

    MySQL数据库事务隔离级别(Transaction Isolation Level)

    http://www.cnblogs.com/zemliu/archive/2012/06/17/2552301.html

    Mysql事务隔离级别设置、详解和测试

    http://blog.csdn.net/gukesdo/article/details/7350580


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

    2021-04-18 15:59:46
    mysql事务隔离级别 分为4种: 读未提交 读已提交 可重复读 序列化 可能出现的问题: 读未提交会出现赃读、不可重复读、幻读; 读已提交会出现不可重复读、幻读; 可重复读会出现幻读; 序列化不会出现以上问题。 ...

    mysql事务隔离级别

    分为4种:

    1. 读未提交
    2. 读已提交
    3. 可重复读
    4. 序列化

    可能出现的问题:

    • 读未提交会出现赃读、不可重复读、幻读;
    • 读已提交会出现不可重复读、幻读;
    • 可重复读会出现幻读;
    • 序列化不会出现以上问题。

    脏读、不可重复读、幻读:

    • 脏读就是一个事务可能读取到其他事务未提交的数据。
    • 最容易混淆的是不可重复读和幻读的区别,mysql默认为可重复读隔离级别,也就是会出现幻读的情况,oracle默认是读已提交隔离级别,会出现不可重复读和幻读。
    • 不可重复读和幻读的区别:
      1. 不可重复读重点在于更新和删除,幻读重点在于新增;
      2. 在可重复读级别下,事务a读取数据后对数据行进行加锁,事务b是不能修改被加锁的数据的,但是在读已提交的隔离级别下,事务b可以修改数据,事务a再次读取就会发现数据变了,这样就会出现不可重复读问题;
      3. 在可重复级别下,事务a读取到数据后,事务b新增了数据,这时事务a再次读取,发现多了之前没有的数据,这就是幻读。
    展开全文
  • Mysql事务隔离级别

    千次阅读 2019-09-18 18:15:28
    主要讲解了事务的特性、事务隔离级别mysql为什么使用可重复读作为默认隔离级别、为什么一般工作中使用读已提交作为事务隔离级别
  • MySQL 事务隔离级别

    2014-07-26 15:13:32
    事务隔离级别
  • MySQL事务隔离级别详解,这个面试经常会面到,必会呀,哈哈
  • mysql 事务隔离级别.pdf

    2021-08-26 15:13:00
    mysql 事务隔离级别.pdf
  • Mysql事务隔离级别.docx

    2019-12-09 15:51:16
    Mysql事务隔离级别.docx
  • mysql 事务隔离级别

    2014-01-22 09:59:47
    MySQL数据库事务隔离级别(Transaction Isolation Level) 数据库隔离级别有四种,应用《高性能mysql》一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上...
  • 主要介绍了Mysql事务隔离级别原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,138
精华内容 35,655
关键字:

mysql事务隔离级别

mysql 订阅