zoukankan      html  css  js  c++  java
  • 事务:Transaction详解

    1、事务概念:
          一组sql语句操作单元,组内所有SQL语句完成一个业务,如果整组成功:意味着全部SQL都实现;如果其中任何一个失败,意味着整个操作都失败。失败,意味着整个过程都是没有意义的。应该是数据库回到操作前的初始状态。这种特性,就叫“事务”。

    2、为什么要存在事务?
       1)失败后,可以回到开始位置
      2)没都成功之前,别的用户(进程,会话)是不能看到操作内的数据修改的

    3、事务4大特征ACID:

      1)原子性[atomicity]:功能不可再分,要么全部成功,要么全部失败
      2)一致性[consistency]:事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
      3)隔离性[isolation]:事务A和事务B之间具有隔离性
      4)持久性[durability]:是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)


    3、相关概念:

    【SQL执行过程】1)执行阶段   2)将执行结果,提交到数据库的阶段

    其中我们的事务日志,就是保存执行阶段的结果,如果用于选择提交,则才将执行的结果提交到数据库。

    默认的执行方式叫做,自动提交。执行完毕,自动完成提交工作。如果你想要所有SQL语句全部成功,就需要关闭自动提交功能。
    “自动提交”:存在一个系统变量,Autocommit可以对自动提交进行设置。

    4、事务操作:

    方法一:

    show variables like 'autocommit'; #查看自动提交是否开启
    set autocommit=1(开启自动提交)
    set autocommit=0(关闭自动提交),关闭后,再次执行相应的更新语句发现,在其它连接(会话)中查看数据,没有发生变化,因为结果没有提交。

    方法二(提倡):

    1)开启事务:start transaction; 关闭自动提交。如果事务结束了,成功或者失败,都会将自动提交机制,回到start时的状态。
    2)成功-->提交:commit;
    3)失败-->回滚:rollback;

    5、重要限制:

      存储引擎必须是innodb才能生效。

    6、个人理解:

        把事务看作一个容器,暂时在该容器(start transaction)中操作(增删改查),如果不出错,就立即更新数据库(commit),即公开可见。如果出错,就立即回滚数据库(rollback),即恢复初始状态,数据库更新停止。

    可以高效地防止错误的发生,快速恢复至初始化状态。

    7、实验测试:

    步骤一:新建两张表,一张是班费表(class),另一张是学生个人钱财表(stu)。

    步骤二:开启事务进行数据操作,注意同时开两个数据库窗口,方便我们查看实验效果

    窗口1:

    此时,可以查看到窗口1中的数据已经更新(我的理解是仅仅是在“事务容器”内更新完成),但是还没有上传至数据库真正更新。在另一个窗口中可见数据库并没有更新成功:

    此时,必须在窗口1中的事务中输入commit命令,才能完成真正意义上的更新,无论开多少个窗口,都可以看到数据更新的内容:

    如果在“事务容器”中更新数据时出现问题,就需要使用rollback命令立即恢复到初始状态。

  • 相关阅读:
    Spring MyBatis多数据源分包
    ubuntu Ngin Install
    Ubuntu16.04开启root用户,并远程登录
    ubuntu16.04LTS更换阿里源
    修改DIV滚动条样式
    Spring-Boot配置文件数据源配置项
    Springboot 版本+ jdk 版本 + Maven 版本的对应关系
    CAS配置(3)之restful-api接入接口
    Java.Cas4.0客户端接入配置
    Java.HttpClient绕过Https证书解决方案二
  • 原文地址:https://www.cnblogs.com/python-wen/p/10288678.html
Copyright © 2011-2022 走看看