一、事务

  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

1.5 (SQL学习笔记)事务处理的更多相关文章

  1. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  2. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  3. SQL学习笔记

    SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...

  4. [SQL学习笔记][用exists代替全称量词 ]

    学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...

  5. SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装

          刚开始接触sql,于是准备在Ubuntu下学习sql,就跟着itercast的sql教程开始入门了. 下面只是我个人的记录,高手请绕道: 一. 在安装之前,我们可以用下面这个命令通过开放端 ...

  6. pl/sql学习笔记---马士兵教程38-48

    Procedure Language/Structure query Language 一.关于语言学习 1.数据类型 2.语法   通过例子来学习很快就能明白 set serverputout on ...

  7. SQL学习笔记之SQL查询练习题1

    (网络搜集) 0x00 表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id ...

  8. SQL学习笔记三(补充-1)之MySQL存储引擎

    阅读目录 一 什么是存储引擎 二 mysql支持的存储引擎 三 使用存储引擎 一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的 ...

  9. SQL学习笔记之MySQL索引知识点

    0x00 概述 之前写过一篇Mysql B+树学习,简单的介绍了B+数以及MySql使用B+树的原因, 有了这些基础知识点,对MySql索引的类型以及索引使用的一些技巧,就比较容易理解了. 0x01 ...

随机推荐

  1. Java多线程学习(三)volatile关键字

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  2. 【1】记一次破解wifi

    当然,使用的依旧是aircrack套件,这次依旧是跑字典,今天,捉到了另一个实验室icephone的wpa握手包,我猜测实验室的wifi一般都跟自己的名字有关,icephone刚好是8位字母,于是我就 ...

  3. 数字签名算法rsa

    数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...

  4. Codeforces Round #483 (Div. 1) 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 为了证明一下我又来更新了,写一篇简要的题解吧. 这场比赛好像有点神奇,E题莫名是道原题,导致有很多选手直接过掉了(Claris 表演24s过题 ...

  5. ThinkSnS v4后台任意文件下载漏洞

    漏洞文件: /apps/admin/Lib/Action/UpgradeAction.class.php 主要问题还是出现在了180行直接将远程获取到的图片直接保存. 文中可见并没有做任何的对$dow ...

  6. 数组返回NULL绕过

    BUGKU:http://120.24.86.145:9009/19.php 还没看完源码,我就直接加了一个password[]=1结果就拿到flag了.然后再看源码我自己都搞不懂为什么可以得到源码. ...

  7. 基于Android的简单聊天工具-服务器端

    1.数据库用的mysql,一共有3张表,一张用户表user.一张朋友列表friend和一张消息表message. 1 User table 用户表 uid 主键自动生成 userName 昵称 use ...

  8. spin lock的理解

    为什么在spin lock保护的代码里面不允许有休眠的操作呢? 因为spin lock不是空实现的前提下(内核没关抢占,或者是SMP打开),spin lock中是关抢占的,如果一个进程A拿到锁,内核抢 ...

  9. java - 线程1打印1-10,当线程打印到5后,线程2打印“hello”,然后线程1继续打印

    public class T { private static int a =1;//1代表线程1 2线程2 public static void main(String[] args) { fina ...

  10. StringBuilder类的作用,以及与String类的相互转换

    # 转载请留言联系 先看一段String类的字符串拼接的代码. String s = "hello" 会在常量池开辟一个内存空间来存储”hello". s += &quo ...