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 :  全部解决

  • 相关阅读:
    ADO.NET中DataSet的应用(读书笔记5)
    ADO.NET中DataTable的应用(读书笔记4)
    如何在前端界面操作数据表(读书笔记3)
    如何在各类空间中输入输出数据(读书笔记2)
    关于利用input的file属性在页面添加图片的问题
    本地存储
    react
    微信开发
    node
    SVN和GIT
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/8747757.html
Copyright © 2011-2022 走看看