zoukankan      html  css  js  c++  java
  • 对事务的特性ACID的理解

                                                                                                对事务的特性ACID的理解

    数据库的事务必须具备ACID特性,ACID是指 Atomicity(原子性)、Consistensy(一致性)、Isolation(隔离型)和Durability(持久性)的英文缩写。

    1、原子性(Atomicity

    事务包装的一组sql,要么都执行成功,要么都失败。这些操作是不可分割的。

    2、一致性(Consistency

            数据库的数据状态是一致的。

    事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性。

    3、持久性:(Durability

    事务成功提交之后,对于数据库的改变是永久的。哪怕数据库发生异常,重启之后数据亦然存在。

    4、隔离性(Isolation

            一个事务的成功或者失败对于其他的事务是没有影响。2个事务应该相互独立。

    事务的隔离级别

    如果不考虑事务的隔离性,由于事务的并发,将会出现以下问题:

    1、脏读 -- 最严重,杜绝发生

    2、不可重复读

    3、幻读(虚读)

     脏读:指一个事务读取了另外一个事务 未提交的数据。

              一个事务读取了另一个事务没有提交的数据,非常严重。应当尽量避免脏读。

     不可重复读:在一个事务内多次读取表中的数据,多次读取的结果不同。

     

      幻读(虚读)

     

     隔离级别:如何解决问题

    l  数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。

    1. read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。

    a)       存在:3个问题(脏读、不可重复读、虚读)。

    b)       解决:0个问题

    1. read committed 读已提交,一个事务读到另一个事务已经提交的数据。

    a)       存在:2个问题(不可重复读、虚读)。

    b)       解决:1个问题(脏读)

    1. repeatable read:可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。

    a)       存在:1个问题(虚读)。

    b)       解决:2个问题(脏读、不可重复读)

    1. serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。

    a)       存在:0个问题。

    b)       解决:3个问题(脏读、不可重复读、虚读)

     安全和性能对比

           安全性:serializable > repeatable read > read committed > read uncommitted

         性能 : serializable < repeatable read < read committed < read uncommitted

    常见数据库的默认隔离级别:

        MySql:repeatable read

       Oracle:read committed

      演示

     查询数据库的隔离级别

    show variables like '%isolation%';
    或
    select @@tx_isolation;

    设置数据库的隔离级别

    set session transaction isolation level 级别字符串

     级别字符串:read uncommitted、read committed、repeatable read、serializable

      例如:set session transaction isolation level read uncommitted;

     

    	读未提交:read uncommitted
    	A窗口设置隔离级别
    	AB同时开始事务
    	A 查询
    	B 更新,但不提交
    	A 再查询?-- 查询到了未提交的数据
    	B 回滚
    	A 再查询?-- 查询到事务开始前数据
    
    	读已提交:read committed
    	A窗口设置隔离级别
    	AB同时开启事务
    	A查询
    	B更新、但不提交
    	A再查询?--数据不变,解决问题【脏读】
    	B提交
    	A再查询?--数据改变,存在问题【不可重复读】
    
    	可重复读:repeatable read
    	A窗口设置隔离级别
    	AB 同时开启事务
    	A查询
    	B更新, 但不提交
    	A再查询?--数据不变,解决问题【脏读】
    	B提交
    	A再查询?--数据不变,解决问题【不可重复读】
    	A提交或回滚
    	A再查询?--数据改变,另一个事务
    
    	串行化:serializable
    	A窗口设置隔离级别
    	AB同时开启事务
    	A查询
    	B更新?--等待(如果A没有进一步操作,B将等待超时)
    	A回滚
    	B 窗口?--等待结束,可以进行操作
    

      

  • 相关阅读:
    [个人]工作中的死亡陷阱
    [阮一峰]在软件开发中,一旦这些技术被取代,你的知识将变得毫无价值,因为它们大部分都是实施的细节。
    [原文 + 补充] 当你在浏览器中输入Google.com并且按下回车之后发生了什么?
    安全的知识点总结
    purge旧的ubuntu 的linux内核
    【个人】运维常识
    windows数字证书管理器
    在mobaxterm内连接deb使用lrzsz进行文件传输
    网络安全常见考试题
    linux deb系 rpm系 配置路由
  • 原文地址:https://www.cnblogs.com/daiwei1981/p/9338420.html
Copyright © 2011-2022 走看看