zoukankan      html  css  js  c++  java
  • 1.5 (SQL学习笔记)事务处理

    一、事务

      1.1事务概念

      事务处理可以用来维护数据库系统数据的完整性,它保证一组SQL语句要么全部都执行,

      要么全部都不执行。(例如一批SQL语句,只要有一个执行失败就全部不执行,即回到失败前的状态

      只有全部成功才会执行)。

      

      例如A向B转账500块钱,先从A账户中扣除500,然后再再B账户中加500.

      执行更新语句时,将A账户钱扣除500了,然后先B账户添加500的语句出错,即没收到钱。

      此时A的钱被扣除了,B也没收到钱。这样显然是不行的,必须保证既然扣了钱就一定要转到,

      或者没有转到就不要扣钱。

      事务可以保证这样一组操作的稳定,使一组操作当成一个整体,使其具有原子性。

      1.2执行事务

      事务开始:begin;

      语句1

      语句2

        ...  

      commit

      begin用于指定事务开始,commit用于手动提交事务。

      之前写的SQL语句都是隐式的提交,即数据库管理软件自动的帮我们提交了。

      但事务不会隐式的提交,所以需要我们手动提交。

      

      我们先来看一个没加事务的例子:

      

      现在hcf向zrx转账500,hcf的balance就变了500,zrx的balance就变成了2000;

      

      因为语句中有ss,所以发生了错误,我们来看下表中数据。

      

       执行了第一个更新语句,之后遇到了错误停止执行。

      出现了钱扣了但是没有转到对方账户的情况。

      这种情况显然是不允许发生的。

      

      接下来我们为其添加事务。

      

      再次执行语句也会出现错误,我们来看下表中数据。

      

      这次虽然转账失败了,但是hcf的钱并没有被扣除。

      这次是才是我们期望的情况,希望扣钱和到账保存一致性,同时成功或者同时失败。

      

      1.3ROLLBACK

      ROLLBACK用于对事务进行回滚,

        1.3.1 rollback是针对事务的,你如果没有在执行语句之前开启事务,那么无法rollbac

        1.3.2 rollback 回滚的意思。 就是数据库里做修改后 ( update ,insert , delete)未commit 之前 使用rollback 可以恢复数据到修改之前。

      在开启事务,且没有COMMIT的前提下使数据恢复到修改之前(即回到这个事务开始前的状态)。

      一个COMMIT或ROLLBACK都代表一个事务结束,例如事务已经COMMIT了,该事务就结束了,

      则无法针对该事务使用ROOLBACK。COMMIT,ROLLBACK都是针对事务而言的。

      

      

      

      可以看到由于ROLLBACK导致回到事务执行前,所有两条语句都未执行。

      

      

      

      

      

      

      1.4保留点

      使用ROLLBACK时直接返回事务开始状态,但有时可能某些操作是有用的,  

      这时我们就可以在事务中设置保留点,回滚时可以回滚到指定的保留点。

      保留点之前的语句保存执行,保留点之后的语句不执行。

      

      

       

        第一条语句执行了,而第二条语句没有执行。

      

      

      

     参考资料:

    《SQL必知必会》

    https://zhidao.baidu.com/question/302234245.html

    https://zhidao.baidu.com/question/1754484965402002068.html

  • 相关阅读:
    Thinkphp框架下对某个字段查询数据的时候进行唯一过滤,返回唯一不同的值
    Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置
    CentOS 6.8下Apache绑定多个域名的方法
    CentOS 6.8下更改Apache默认网站安装目录
    Ubuntu 16.04系统下安装PHP5.6*
    Ubuntu 16.04系统下解决Vim乱码问题
    jQuery 核心
    Ubuntu 16.04系统下安装Discuz出现“HTTP ERROR 500”目前无法处理此请求
    BCB6 重装后的项目编译莫名问题
    LR6 碱性电池才能带动微软鼠标
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/10600777.html
Copyright © 2011-2022 走看看