zoukankan      html  css  js  c++  java
  • 事务ACID如何定义,事务隔离性解决的问题

    挚享科技 2018.4.8  

     事务的四个特性: 

    1. 原子性: 同一个事务的多个操作,要么都成功,要么全部失败回滚。

    2. 一致性: 事务必须确保数据库从一个一致性状态变换为另一个一致性状态。 其实就是操作完成后数据库仍然满足完整性约束。比如ab 工500,转账后合计应该还是500.

    3. 隔离性 : 多个事务并发执行时,一个事务的执行不影响其他事务的执行。

    4. 持久性: 事务提交完成后数据得到固化,对数据库的修改永久保存了。

    不考虑事务隔离性会导致的问题 

    我们以X表的 count 为例子

    1. 第一类丢失更新: 也叫回滚丢失: 假设两个事务都去更新count,读取到count 都是100, A事务成功,更新count到101 ,但是B事务更新失败回滚count到100.导致A事务的更新丢失了

    2. 脏读 : 事务B读取了事务A修改但未正式提交的更新。 事务更新count 到101 ,但未提交。此时事务B读取count为101 ,然后加1 变为102,提交成功。但是A 由于某种原因回滚了。就导致count 变成102 。

    3. 不可重复读 : 同一个事务里对count 做多次查询结果不一致。 事务A 第一次读count 是100, 此时事务B更新提交了count 到101 。。事务A又读了一次count .两次读取结果不一致。 

    4. 第二类丢失更新: 又叫覆盖丢失。 事务A,B 都读到count 是100,然后都去更新,结果是101. 实际应该是102 ,造成有一个事务的更新被覆盖丢失了。

    5. 幻读 :和不可重复读类似(不可重复读重点在update e , 幻读重点在insert和 delete)。只是不是针对数据的值而是针对的数据的条数,就是一个事务两次查询 X 表的数据条数不一致。。

    三种隔离级别 

    Read Commited : 解决1,2  。。 一个事务只能看到已经提交的更新,看不到未提交的更新。。

    Repeatable Read : 解决 1,2,3,4,  只要存在读该行数据,就禁止写。。

    Serializable :  全部解决

  • 相关阅读:
    [Tips]git cannot lock ref
    [BUG]Git Sever搭建与相关错误处理
    [Tips]matplotlib 命令行画图保存
    [Tips]Torch功能点记录
    5G元年教育产业再出发 科技赋能的“风口与风险”仍待明晰
    Adobe逆天AI黑科技:美颜照克星,秒还原PS照片
    计算机算法能听声音绘制人脸
    2019 CESA,智能座舱越来越“懂你”
    谷歌首席决策科学家:AI难免犯错,唯有人类可以悬崖勒马
    百度:如何将AI进行到底?
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/8747757.html
Copyright © 2011-2022 走看看