1.事务的4大特征(ACID)

ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)

  • Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read
    uncommitted)、读提交(read committed)、可重复读(repeatable
    read)和串行化(Serializable)。
  • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

2.MYSQL INNODB 4种隔离级别

事务隔离是数据库处理的基础之一。隔离是首字母缩写ACID中的I;隔离级别是在多个事务同时进行更改并同时执行查询时,微调结果的性能和可靠性、一致性和再现性之间的平衡的设置。

  • READ UNCOMMITTED(未提交读)

    选择语句以非锁定的方式执行,但可能会使用行的早期版本。因此,使用这种隔离级别,这样的读取并不一致。这也被称为一个dirty
    read.(脏读)。否则,此隔离级别会像已提交的READ一样工作

    例如:
    创建表:

    CREATE TABLE `my_test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;INSERT INTO `my_test` (`name`) VALUES ('1');
    

    设置sesion隔离级别为READ UNCOMMITTED

    set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    

    开启事务T1修改id=1的name=‘2’

    start TRANSACTION
    
    select * from my_test where id =1;
    

    update my_test set `name` = '2' where id = 1;
    

    开启事务T2查询id=1的name值

     ```sqlstart TRANSACTIONselect * from my_test where id =1;```
    


    t2可以查询到t1未提交事务的值,如果t1回滚事务,t2读到数据就是脏读

  • READ COMMITTED(已提交读)
    每个一致的读取,即使是在同一事务中,都会设置并读取自己的新快照。 对于锁定读取(SELECT
    with FOR UPDATE or LOCK IN SHARE MODE), UPDATE statements, and DELETE
    statements,InnoDB只锁定索引记录,而不是它们之前的间隙,因此允许在锁定记录旁边自由插入新记录。间隙锁定仅用于外键约束检查和重复键检查

    由于间隙锁定已被禁用,因此可能会出现虚拟行问题,因为其他会话可以在间隙中插入新的行。以获取有关幻像行的信息

    READ COMMITTED隔离级别只支持基于行的二进制日志记录。如果使用 binlog_format=MIXED,服务器会自动使用基于行的日志记录

    使用已提交的READ还具有其他效果:

    • 对于更新或删除语句,InnoDB只对更新或删除的行的锁。在MySQL评估了where条件后,将释放不匹配行的记录锁。这大大降低了死锁发生的概率,但它们仍然有可能发生。
    • 对于更新语句,如果一行已经被锁定,InnoDB将执行“半一致”读取,将最新提交的版本返回给MySQL,以便MySQL可以确定该行是否匹配更新的where条件。如果该行匹配(必须更新),MySQL将再次读取该行,这次InnoDB要么锁定它,要么等待锁定它

    考虑以下例子,从此表开始:

    CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB;
    INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2);
    COMMIT;
    

    在这种情况下,该表没有索引,因此搜索和索引扫描使用隐藏的集群索引来锁定记录

    假设有一个会话使用以下语句执行更新:

    # Session A
    set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
    START TRANSACTION;
    UPDATE t SET b = 5 WHERE b = 3;
    

    还假设第二个会话通过在第一个会话之后执行此语句来执行更新:

    # Session B
    UPDATE t SET b = 4 WHERE b = 2;
    

    当InnoDB执行每次更新时,它首先为其读取的每行获取一个独占锁,然后决定是否修改它。如果InnoDB不修改该行,则它将释放该锁。否则,InnoDB将保留该锁,直到事务结束。这将影响以下事务处理。

    当使用默认的(REPEATABLE READ)可重复读隔离级别时,第一个更新对其读取的每行获取x锁,并且不释放其中任何一行:

    x-lock(1,2); retain x-lock
    x-lock(2,3); update(2,3) to (2,5); retain x-lock
    x-lock(3,2); retain x-lock
    x-lock(4,3); update(4,3) to (4,5); retain x-lock
    x-lock(5,2); retain x-lock
    

    第二个更新块一旦尝试获取任何锁(因为第一次更新保留了所有行上的锁),并且直到第一次更新提交或回滚后才继续进行:

    x-lock(1,2); block and wait for first UPDATE to commit or roll back
    

    如果使用(READ COMMITTED)已提交读,第一个更新将获取其读取的每行的x锁,并释放未修改的行:

    x-lock(1,2); unlock(1,2)
    x-lock(2,3); update(2,3) to (2,5); retain x-lock
    x-lock(3,2); unlock(3,2)
    x-lock(4,3); update(4,3) to (4,5); retain x-lock
    x-lock(5,2); unlock(5,2)
    

    对于第二次更新,InnoDB执行一个“半一致”读取,返回它读取到MySQL的每一行的最新提交版本,以便MySQL可以确定该行是否匹配更新的where条件:

    x-lock(1,2); update(1,2) to (1,4); retain x-lock
    x-lock(2,3); unlock(2,3)
    x-lock(3,2); update(3,2) to (3,4); retain x-lock
    x-lock(4,3); unlock(4,3)
    x-lock(5,2); update(5,2) to (5,4); retain x-lock
    

    但是,如果where条件包含一个索引列,并且InnoDB使用该索引,则在获取和保留记录锁时只考虑该索引列。在下面的示例中,第一个更新获取并保留行where b = 2的锁。当第二个更新块试图获取相同记录上的x个锁时,因为它还使用了在b列上定义的索引。

    CREATE TABLE t (a INT NOT NULL, b INT, c INT, INDEX (b)) ENGINE = InnoDB;
    INSERT INTO t VALUES (1,2,3),(2,2,4);
    COMMIT;
    # Session A
    START TRANSACTION;
    UPDATE t SET b = 3 WHERE b = 2 AND c = 3;
    # Session B
    START TRANSACTION;
    UPDATE t SET b = 4 WHERE b = 2 AND c = 4;
    

    使用READ COMMITTED隔离级别的效果与启用已弃用的innodb_locks_unsafe_for_binlog变量相同,但有以下例外:

    • 启用innodb_locks_unsafe_for_binlog是一个全局设置,它会影响所有会话,而隔离级别可以为所有会话全局设置,或者为每个会话单独设置。
    • innodb_locks_unsafe_for_binlog只能在服务器启动时设置,而隔离级别可以在启动时设置或在运行时更改。
      因此,READ COMMITTED提供了比innodb_locks_unsafe_for_binlog更精细、更灵活的控制。
  • REPEATABLE READ(可重复读)
    这是InnoDB的默认隔离级别。同一事务中的一致读取读取由第一次读取所建立的快照。这意味着,如果在同一事务中发出几个普通(非锁定)选择语句,则这些选择语句彼此也保持一致,参考mysql
    一致的非锁紧读取

    对于锁定读取(SELECT with FOR UPDATE or LOCK IN SHARE
    MODE)、更新和删除语句,锁定取决于语句是使用具有唯一搜索条件的唯一索引还是范围类型搜索条件。

  • SERIALIZABLE(串行化)
    这个级别类似于可重复读取,但是InnoDB隐式地转换了所有的普通的选择语句来选择。如果禁用了autocommit(SELECT …
    LOCK IN SHARE
    MODE)。如果启用了自动提交,则选择为其自己的事务。因此,已知它是只读的,如果执行一致(非锁定)读取,则可以串行化,并且不需要对其他事务进行串行化。(要强制普通选择阻止其他事务已修改选定行,请禁用autocommit.。)

mysql5.7事务隔离级别相关推荐

  1. 关于MySQL的四种事务隔离级别!

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不 ...

  2. mysql选什么隔离级别_互联网项目中mysql应该选什么事务隔离级别

    摘要 企业千万家,靠谱没几家. 社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:"讲讲mysql有几个事务隔离级别?& ...

  3. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  4. 互联网项目中MySQL应该选什么事务隔离级别

    引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:"讲讲mysql有几个事务隔离级别?"   你:"读未提交,读已提交,可重复读,串行化四个!默认是可重 ...

  5. mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...

    概述 今天主要分享一个最近做的实验,主要是测试mysql数据库在RR和RC不同事务隔离级别下的表现. MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog.RR能提供SQL语句的写 ...

  6. mysql locked myisam_MySql 事务 隔离级别 知识点

    1. SQL 语句 常用的Sql语句总结: --------s-------- SELECT Websites.name, Websites.url, SUM(access_log.count) AS ...

  7. mysql 事务 隔离级别_MySQL的四种事务隔离级别

    https://www.cnblogs.com/huanongying/p/7021555.html 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的 ...

  8. SpringCloud工作笔记054---事物处理_MySQL的四种事务隔离级别_以及修改Mysql默认隔离级别

    JAVA技术交流QQ群:170933152 Mysql修改默认隔离级别: MySQL mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读 1.查看当前会话隔离级别 sel ...

  9. 【MySQL】MySQL的四种事务隔离级别

    [MySQL]MySQL的四种事务隔离级别 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事 ...

最新文章

  1. python3爬虫基础学习
  2. React中使用setState
  3. python线程代码_python--(十步代码学会线程)
  4. Spring Annotation(@Autowire、@Qualifier)
  5. PROD_ROOT and PRD_ROOT
  6. DotNetCore Web应用程序中的Cookie管理
  7. 【做题记录】CF1428E Carrots for Rabbits—堆的妙用
  8. Java内存泄漏介绍
  9. php+数组转换函数是,php数组与字符串的转换函数大全
  10. H264基本概念之 宏块、片和片组
  11. java web 编程技术 pdf_Java WEB编程技术.pdf
  12. windows服务器新建管理员用户_用户和组管理
  13. SilverLight 初探一
  14. 根据经纬度和日期计算日出日落时间
  15. ToF 3D视觉传感技术详解、应用场景和市场前景
  16. linux文件误删恢复解决方案
  17. Python数据爬虫学习笔记(11)爬取千图网图片数据
  18. 大学计算机word操作题步骤,计算机二级题库word操作步骤
  19. 枫叶HD高清视频转换器 V10.2.2.0 官方安装版
  20. 数据库设计中的英文术语表

热门文章

  1. JS实现单表代换密码加密
  2. chattr和chmod
  3. Ant Design Vue 新手入门使用教程
  4. java实训简单计步器实训报告_基于android的手机计步器设计与实现毕业论文
  5. java集合类List的用法
  6. Android反调试之 AntiEmulator 检测安卓模拟器
  7. 从甜心教主“炸”活中年男粉看企业如何让“沉睡数据醒来说话”?
  8. 财报里的百度智能云,讲出了产业智能化的故事
  9. Bootstrap table 新增/删除空白行的方法
  10. 秒杀(二)关于秒杀系统的思考与解决方案