zoukankan      html  css  js  c++  java
  • 数据库事务与脏读、不可重复读、幻读

    事务定义

    • Transaction
    • 事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
    • 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
    • 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同
       

    事务四大特征(ACID)

    • 原子性(A):事务是最小单位,不可再分
    • 一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
    • 隔离性(I):事务A和事务B之间具有隔离性
    • 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)

    事务的一些术语

    • 开启事务:Start Transaction
    • 事务结束:End Transaction
    • 提交事务:Commit Transaction
    • 回滚事务:Rollback Transaction

    事务相关的两条重要的SQL语句(TCL)

    • commit:提交
    • rollback:回滚

    事务开启的标志

    • 任何一条DML语句(insert、update、delete)执行,标志事务的开启

    结束标志(提交或者回滚):

    • 提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
    • 回滚:失败的结束,将所有的DML语句操作历史记录全部清空

    事物与数据库底层数据

            在事物进行过程中,未结束之前,DML语句是不会更改底层数据,只是将历史操作记录一下,在内存中完成记录。只有在事物结束的时候,而且是成功的结束的时候,才会修改底层硬盘文件中的数据

    在MySQL中,事务提交与回滚

            在MySQL中,默认情况下,事务是自动提交的,也就是说,只要执行一条DML语句就开启了事物,并且提交了事务

    事务四大特性之一,隔离性(isolation)

    1. 事物A和事物B之间具有一定的隔离性
    2. 隔离性有隔离级别(4个) 
      • 读未提交:read uncommitted
      • 读已提交:read committed
      • 可重复读:repeatable read
      • 串行化:serializable

    脏读、不可重复读、幻读

    【1】脏读(读取未提交数据)

    A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。
    就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了
    这个脏数据,但事务B良心发现,又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结
    果就是事务A读取了此次的脏数据,称为脏读。

    【2】不可重复读(前后多次读取,数据内容不一致)

    事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。而在事务A第一次读取数
    据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取
    到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数
    据,成为不可重复读。

    【3】幻读(前后多次读取,数据总量不一致)

    事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提
    交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成
    为幻读。

    不可重复读和幻读区别

    • 不可重复读是读取了其他事务更改的数据,针对insert与update操作

            解决:使用行级锁,锁定该行,事务A多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。

    • 幻读是读取了其他事务新增的数据,针对insert操作

            解决:使用表级锁,锁定整张表,事务A多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据。

  • 相关阅读:
    五、Docker网络管理
    四、Docker存储管理
    三、Docker镜像基础管理
    二、Docker容器基础管理
    模仿DotnetCore中间件的方式,做一个列表过滤的功能
    web开发常见的鉴权方式
    Go语言使用Godep进行包管理
    Go语言中的数据格式(json、xml 、msgpack、protobuf)
    epoll原理解释(转)
    内存管理之内存池概述(转)
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615324.html
Copyright © 2011-2022 走看看