• MySQL事务及隔离级别(读书小结)


    标签: MySQL事务 隔离

    0.什么是事务?

    事务是指MySQL的一些操作看做是一个不可分割的执行单元。事务的特点是要么所有操作都执行成功,要么一个都不执行。也就是如果一个事务有操作执行失败,那么就会撤销该事物之前的所有操作,使数据库回到事务开始前的状态,此时就像什么事也没发生过一样。

    1.事务的ACID特性

    • 原子性Atomicity:事务的所有操作是一个不可分割的整体,要么都完成,要么都不做。
    • 一致性Consistency:数据库保持从一个一致的状态到另一个一致的状态。如果一个事务执行了一部分,操作已经写入到物理数据库,此时发生了系统故障导致事务中断,但事务对数据库的修改又不可撤销了,此时数据库就处于一个不一致的状态。
    • 隔离性Isolation:事务的操作是相互隔离,互不干扰的。(但是结果会有影响,如可看到其他事务操作的结果)
    • 持久性Durability:事务的执行结果一旦完成就会对数据库造成永久改变,接下来的操作或故障不会对其有任何影响。

    2.事务间可能出现的问题

    • 脏读:一个事务读取到另一个事务的操作结果,但另一个事务之后又回滚撤销了,导致读取的结果有不存在的情况。
    • 不可重复读:两次select结果不同。一个事务内的其他实例做了更新,一个实例在更新前后两次查询结果不同。
    • 幻读:两次select结果不同。一个事务查询之后,另一个事务做了插入操作,此时这个事务再查询发现比第一次查询多了一些行,两次查询结果不同。

    3.四种事务隔离级别

    • Read Uncommitted(读未提交):本事务可以读取其他事务未提交的结果。会导致脏读、不可重复读、幻读。
    • Read committed(读已提交):本事务只能读取其他事务提交后的结果。会导致不可重复读、幻读。
    • Repeatable Read(可重复读):保证同一事务的多个实例读取到相同的结果。会导致幻读。InnoDB使用多版本并发机制(MVCC)解决该问题。
    • Serializable(可串行化):在数据上加锁,锁定数据,使事务之间不可能发生冲突。会导致事务大量超时和锁竞争。让事务之间完全的隔离。不会导致事务之间出现的问题。

    上面四种隔离程度依次是由低到高,处理并发效率由高到低。

    4.MySQL选取隔离级别命令

    用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别。
    语法如下:

    SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
    

    注意:默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。
    使用GLOBAL在全局对从开始创建的所有新连接设置事务级别。需要最高权限。
    使用SESSION在当前连接上执行的事务设置事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。

    查询全局和会话事务隔离级别:

    SELECT @@global.tx_isolation; 
    SELECT @@session.tx_isolation; 
    SELECT @@tx_isolation;
    

    5.总结

    • 在低级别隔离,当多个事务并发执行时会导致多种问题,但是并发性好,可高效执行多个事务。
    • 在高级别隔离,多个事务并发执行不会导致太多问题,但并发性差,执行多个事务效率低下。
    • MySQL的InnoDB默认隔离是Repeatable Read(可重复读),oracle等多数数据库使用Read Committed(读已提交)。
    • 实际中,在会计、银行、证券公司、股票等需要使用高安全性之外,为了兼顾并发性能其他要求相对低的应用可以使用级别较低的隔离。具体使用哪个,还是要由项目的需求决定。

    参考:
    http://www.linuxidc.com/Linux/2017-02/140848.htm
    http://www.3lian.com/edu/2014/05-05/145482.html
    http://blog.itpub.net/195110/viewspace-1080777/
    http://www.cnblogs.com/tekkaman/p/5150663.html

  • 相关阅读:
    Webpack 学习2
    Webpack 学习
    JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后
    JS魔法堂:再识Number type
    基础野:细说浮点数
    基础野:细说有符号整数
    基础野:细说无符号整数
    基础野:细说原码、反码和补码
    Vim魔法堂:认识快捷键绑定
    Httpd运维日志:通过apxs添加模块
  • 原文地址:https://www.cnblogs.com/fefjay/p/6513244.html
Copyright © 2020-2023  润新知