zoukankan      html  css  js  c++  java
  • 事务的ACID是指什么?

    事务的ACID是指什么?

    • 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
    • 一致性(Consistent):事务结束后系统状态是一致的;
    • 隔离性(lsolated):并发执行的事务彼此无法看到对方的中间状态;
    • 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据;
      关于事务,在面试中被问到的概率是很高的,可以问的问题也是很多的。首先需要知道的是,只有存在并发数据访问时才需要事务。当多个事务访问同一数据时,可能会存在5类问题,包括3类数据读取问题(脏读、不可重复读和幻读)和⒉类数据更新问题(第1类丢失更新和第⒉类丢失更新)。

    脏读(Dirty Read) :A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。

    这种情况常发生于转账与取款操作中。

    时间顺序 转账事务 取款事务
    1 开始事务
    2 开始事务
    3 查询账户余额为2000元
    4 取款1000元,余额被更改为1000元
    5 查询账户余额为1000元(产生脏读)
    6 取款操作发生未知错误,事务回滚,余额变更为2000元
    7 转入2000元,余额被更改为3000元(脏读的1000+2000)
    8 提交事务

    备注:按照正确逻辑,此时账户余额应该为4000元

    不可重复读(Unrepeatable Read) :事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了。

    例子:
    在事务A中,Jack读取了自己的工资为1000,但是此时事务1的操作还并没有完成 ,后面还有1次相同的读取操作。
    在事务B中,这时财务人员修改了Jacck的工资为2000,并提交了事务。
    在事务A中,Jack再次读取自己的工资时,工资变为了2000。
    在一个事务中前后两次读取的结果并不致,导致了不可重复读。

    幻读(Phantom Read):事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行。

    时间顺序 事务A 事务B
    1 开始事务
    2 开始事务
    3 统计总存款为10000元
    4 新增一个存款账户存入1000元
    5 提交事务
    6 再次查询总存款为11000元(幻读)

    备注:按照正确逻辑,事务A前后两次读取到的数据总量应该一致。

    第1类丢失更新:事务A撤销时,把已经提交的事务B的更新数据覆盖了。

    时间顺序 取款事务A 转账事务B
    1 开始事务
    2 开始事务
    3 查询账户余额为1000元
    4 查询账户余额为1000元
    5 汇入100元修改余额为1100元
    6 提交事务
    7 取出100元将余额修改为900元
    8 撤销事务
    9 余额恢复为1000元(丢失更新)

    第2类丢失更新:事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失。

    时间顺序 取款事务A 转账事务B
    1 开始事务
    1 开始事务
    3 查询账户余额为1000元
    4 查询账户余额为1000元
    5 取出100元修改余额为900元
    6 提交事务
    7 汇入100元将余额修改为1100元
    8 撤销事务
    9 查询账户余额为1100元(丢失更新)

    SQL92标准定义了4个等级的事务隔离级别,如下表所示:(×表示不允许,√表示允许)

    隔离级别 脏读 不可重复读 幻读 第一类丢失更新 第二类丢失更新
    读未提交(Read uncommitted) ×
    读已提交(Read committed) × ×
    可重复读(Repeatable read) × × × ×
    可串行化(Serializable) × × × × ×

    MySQl

    MySql默认的隔离级别为Repeatable Read,因此只会出现幻读的情况。

    Oracle

    Oracle默认的隔离级别为Read Committed,因此可能出现不可重复度和幻读。

  • 相关阅读:
    PHP IDE NetBeans代码主题和除掉竖线解决方案
    初识Python
    从LazyPhp说起
    从Pycharm说起
    准备系统地研究一下"高性能网站开发",挑战很大,希望能坚持到底!
    IIS日志分析[资源]
    见一好东西:Threaded WebDownload class with Progress Callbacks
    ASP.net Application 中使用域用户登录
    看图找错
    汉字转拼音缩写的函数(C#)
  • 原文地址:https://www.cnblogs.com/jone-chen/p/14309387.html
Copyright © 2011-2022 走看看