zoukankan      html  css  js  c++  java
  • Transaction ACID 事务及事务特性

    事务一般是针对DB来讨论

    而且基本是讨论4方面,目前的解释都是在DB上讨论的

     

    ACID

    • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
    • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
    • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
    • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

    以在线购物为例

    A花费100 购买B的商品,整个操作整体被当成事务处理

    Before

    A账户1000

    B账户1000

    After

    A账户900

    B账户1100

      

    原子性

    整个操作包含2个部分

    1、A账户 1000-100=900

    2、B账户 1000+100=1100

    这两个步骤一起成功,或者一起失败,不能只发生其中一个动作

     

    一致性

    如果上面2个步骤其中一个失败了,AB账户就会有金额上的损失

     

    持久性

     完成操作后,所有数据都会保存在DB

     

    隔离性

    在多事务并发执行时,事务彼此间不影响

    银行转账

    A账户初始1000

    B账户初始0

    C账户初始900

     

    事务1:A转账200 到B账户

    事务2:C转账100 到B账户

    正常执行结束后,

    A:800

    B:300

    C:800

    可能出现的问题

    脏读:

    当一个事务允许读取另外一个事务修改但未提交的数据时,就可能发生脏读。

    如果事务1和2 ,出现脏读,并且一个事务2失败,就可能会

    出现B的数据出现问题,事务2失败,但是B中依然会有300

     

    不可重复读

    在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。

     

     

    幻读

    在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。

     

    隔离级别

     

    隔离级别

    脏读

    不可重复读

    幻影读

    未提交读

    可能发生

    可能发生

    可能发生

    提交读

    -

    可能发生

    可能发生

    可重复读

    -

    -

    可能发生

    可串行化

    -

    -

    -

  • 相关阅读:
    linux最简单项目部署
    sql索引
    /etc/profile和~/.bash_profile区别
    Linux下查找软件的目录位置
    为什么要使用消息队列?
    idea中常用的快捷键
    PAT 甲级 1023 Have Fun with Numbers (20分)
    PAT《算法笔记》
    Text 2
    Text-1
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/12347900.html
Copyright © 2011-2022 走看看