• mysql由浅入深探究(四)----mysql事务详解


    1. 什么是事务: 通俗的解释就是对数据库进行的一组完整的操作,这组完整的操作中包含一个或多个操作。解释的太low了,来点官方的:事务就是DBMS中执行的一个完整的逻辑单元,这个逻辑单元中包含一个或者多个操作。
    2. 事务的作用: 上面说了事务的定义,但不太能体现事务的重要性,其实事务是一个很重要的概念,我们经常会听到一些相关的名词: 回滚,隔离(当然这里只是说数据库的,其实这两个概念的含义更加广泛),这就是事务的作用。
        • 回滚:  事务作为一个逻辑单元,具有回滚的作用。回滚就是说我们在进行处理事务的时候,我们能够对事务进行回滚,恢复到事务开始之前的状态。其本质是通过记录事务开始前状态来实现的,这个后面再说吧。
        • 隔离:  隔离,顾名思义就是把这些逻辑单元给隔离起来,不让其他逻辑单元进行干扰。实际应用中我们会有多个线程同时对数据库进行操作,比如A在修改,B也在修改,如果不加以控制,很可能造成脏数据。
    3. 事务特性ACID:  
        • A: Atomicity原子性,怎么理解--就是只存在一个状态的性质,要么执行成功,要么执行失败,只可能是这两种情况,并且只能出现其中一种情况! 
        • C:   Consistency一致性,一致性说的是数据库中的数据满足完整性约束。
        • I:  Isolation隔离性,隔离性的意思是同时存在两个事务的时候不能相互干扰。
        • D: durability持久性,就是事务所做出的更改必须能持久化到硬盘,不至于轻易丢失。 
    4. 上面已经介绍了事务的基本的性质,作用:扯了一堆理论知识,现在我们来点实战性的!!! 

          上面我们已经介绍了事务的概念,那么我们如何操作事务呢?操作的方式有很多,比如java中的jdbc,或者是shell都行!下面我们通过终端来学一下,首先我们应该知道一个概念叫自动提交,那么什么是自动提交呢?这个很好理解,就是在操作数据库时我们不必显示的进行事务提交,而由mysql自动替我们完成。

    A.  查看mysql的提交方式:show variables like 'autocommit';能够查看数据库是否是自动提交的。

        B.   设定mysql的自动提交方式:  set autocommit=false;就可以设定mysql不自动提交了。

        C.   自动提交pk手动提交:下面我们来试试自动提交和手动提交的差别:

        • 自动提交:我们执行一条命令后我们就没有反悔的权利了!比如,银行的业务中,A向B转账100元,银行需要做的有两步,首先A银行卡中减去100元,B银行卡中增加100元,但是如果设置为自动提交,当第一步完成了银行服务器宕机了,那么完了,数据出现了问题。所以企业通常都会设置autocommit为false。
        • 手动提交:   
          • 开启事务: 方式begin,start transaction,set autoCommit
          • 提交事务: commit
          • 回滚事务: rollback
          • 事务实例: 举一个例子来说明事务:我们有这样一个员工表Baidu(name,age,salary);

    下面我们对这个表进行操作,首先通过上述方法设置开启事务,插入一条数据,查看数据库,提交或者回滚(注意,这里我们在同一个终端进行操作,因为不同终端设计到事务的隔离性。我们下一节会学习)如下:

    上面我们已经插入了一个记录,我们可以在本终端进行查看,我们在这个终端可以发现已经插入成功了,但是如果此时进行rollback操作,再查看就会发现插入的数据消失了。如果提交,那么数据将会被持久化到数据库中。

    D. 事务的原理:   上面的操作我们会发现,在未提交时我们可以对事务进行回滚,那么我们需要知道为什么能进行回滚呢?实际上mysql是通过日志的方式来进行回滚的,我们在会对事务内的操作进行日志记录,如果发生回滚现象,mysql将会读取日志信息进行redo(将已经执行成功但是没有持久化到硬盘中的数据进行持久化),用这样的办法来保证一致性。然后再将事务中没有提交的部分进行Undo,用此方法来保证原子性。                          

                           

  • 相关阅读:
    2018-12-25-dot-net-double-数组转-float-数组
    2018-12-25-dot-net-double-数组转-float-数组
    2019-10-24-dotnet-列表-Linq-的-Take-用法
    2019-10-24-dotnet-列表-Linq-的-Take-用法
    2018-8-10-C#-代码占用的空间
    2018-8-10-C#-代码占用的空间
    2018-4-29-C#-金额转中文大写
    2018-4-29-C#-金额转中文大写
    Java实现 LeetCode 630 课程表 III(大小堆)
    Java实现洛谷 P1072 Hankson 的趣味题
  • 原文地址:https://www.cnblogs.com/liboBlog/p/6070518.html
Copyright © 2020-2023  润新知