zoukankan      html  css  js  c++  java
  • 简述数据库的事务隔离级别

    数据库的事务隔离级别

    1. 事务的基本要素(ACID)

    1. 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
    2. 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
    3. 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B 不能向这张卡转账。
    4. 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

    2. 事务的并发问题

    1. 脏读:事务A 读取了事务B 更新的数据,然后B 回滚操作,那么A读取到的数据是脏数据
    2. 不可重复读:事务A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A 多次读取同一数据时,结果不一致。
    3. 幻读:系统管理员A 将数据库中所有学生的成绩从具体分数改为ABCDE 等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

    小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表


    3. 事务隔离级别

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted) 可能 可能 可能
    读已提交(read-committed) 不可能 可能 可能
    可重复读(repeatable-read) 不可能 不可能 可能
    串行化(serializable) 不可能 不可能 不可能
    • 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
    • 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
    • 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
    • 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

    Read Uncommitted这种级别,数据库一般都不会用,而且任何操作都不会加锁,这里不讨论。

    mysql默认的事务隔离级别为 repeatable-read

    可以通过下面的代码更改数据库当前的事务隔离级别:

    set session transaction isolation level 【隔离级别】
    

    例如:

    补充:

    1、事务隔离级别为读提交时,写数据只会锁住相应的行

    2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

    3、事务隔离级别为串行化时,读写数据都会锁住整张表

    4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

  • 相关阅读:
    HDU 4024 Dwarven Sniper’s hunting(数学公式 或者是二分)
    二分图最大匹配总结
    HDU 4022 Bombing (STL应用)
    HDU 1847 Good Luck in CET4 Everybody!(组合博弈)
    HDU 1556 Color the ball(树状数组)
    HDU 4023 Game(博弈)
    HDU 1406 完数(水题)
    HDU 4021 24 Puzzle
    Oracle 多表查询优化
    【编程之美】字符串移位包含的问题(续)
  • 原文地址:https://www.cnblogs.com/luler/p/14546083.html
Copyright © 2011-2022 走看看