MySQL事务控制语句(学习笔记)

MySQL事务控制语句 
        在mysql命令行的默认下,事务都是自动提交的,sql语句提交后马上会执行commit操作。因此开启一个事务必须使用begin,start transaction,或者执行 set autocommit=0;
 可以使用的事务控制语句

start transction | begin : 显示的开启一个事务
 commit (commit work)
    commit work与completion_type的关系,commit work是用来控制事务结束后的行为,是chain还是release的,可以通过参数completion_type来控制,默认为0(或者NO_CHAIN),表示没有任何操作 与commit效果一样。当completion_type=1的时候

  1. mysql> set names utf8;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> create table t(a int, primary key (a))engine=innodb;
  4. Query OK, 0 rows affected (0.29 sec)
  5. mysql> select @@autocommit;
  6. +--------------+
  7. | @@autocommit |
  8. +--------------+
  9. |            1 |
  10. +--------------+
  11. 1 row in set (0.00 sec)
  12. mysql> set @@completion_type=1;
  13. Query OK, 0 rows affected (0.00 sec)
  14. mysql> begin;
  15. Query OK, 0 rows affected (0.00 sec)
  16. mysql> insert into t select 1;
  17. Query OK, 1 row affected (0.00 sec)
  18. Records: 1  Duplicates: 0  Warnings: 0
  19. mysql> commit work;
  20. Query OK, 0 rows affected (0.00 sec)
  21. mysql> insert into t select 2;
  22. Query OK, 1 row affected (0.00 sec)
  23. Records: 1  Duplicates: 0  Warnings: 0
  24. mysql> insert into t select 2;
  25. ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
  26. mysql> rollback;
  27. Query OK, 0 rows affected (0.00 sec)
  28. # 回滚之后只有1这个记录,而没有2这个记录
  29. mysql> select * from t;
  30. +---+
  31. | a |
  32. +---+
  33. | 1 |
  34. +---+
  35. 1 row in set (0.00 sec)

测试中,将completion_type设置成1,第一次通过commit work来insert这条记录。之后insert 2的时候并没有启用begin(start transaction)来开启一个事务,之后再插入一条重复的记录2,这时会抛出异常rollback后,最后发现只有1这样一条记录,2并没有被insert进去。因为completion_type为1的时候,commit work会开启另外一个事务,因此2个insert语句是在同一个事务里面的,所以回滚后就没有insert进去。

参数completion_type为2时,commit work等同于commit and release。当事务提交时候会自动断开与db的连接,如下:

  1. mysql> set @@completion_type=2;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> begin
  4. -> ;
  5. Query OK, 0 rows affected (0.00 sec)
  6. mysql> insert into t select 3;
  7. Query OK, 1 row affected (0.00 sec)
  8. Records: 1  Duplicates: 0  Warnings: 0
  9. mysql> commit work;
  10. Query OK, 0 rows affected (0.00 sec)
  11. mysql> select @@versison;
  12. ERROR 2006 (HY000): MySQL server has gone away
  13. No connection. Trying to reconnect...
  14. Connection id:    205656
  15. Current database: test
  16. ERROR 1193 (HY000): Unknown system variable 'versison'
  17. mysql>

通过上面的测试发现,completion_type设置成2时,commit work之后,再通过select获取db服务器版本信息的时候出现2006的error,说明以及断开了与db的连接。

rollback,rollback work与commit,commit work的工作原理一样。

rollback(rollback work)
 savepoint identifier:在事务中创建一个保存点,一个事务允许有多个保存点
 release savepoint identifier:删除事务中的保存点,当时一个保存点也没有时执行这个命令,会报错抛出一个异常,如下所示:

  1. mysql> begin;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> rollback to savepoint t1;
  4. ERROR 1305 (42000): SAVEPOINT t1 does not exist
  5. mysql>

innodb存储引擎中的事务都是原子性的,说明以下2种情况:
构成事务的每条语句都会commit,否则事务的每条语句都会rollback,这种保护还会涉及到单调的语句。一条语句要不完成成功要么完全回滚,
但是一条语句失败并不会导致前一条执行的语句自动回滚,他们的工作会保留,需要你手动commit或者rollback。如下:

  1. mysql>  create table t(a int, primary key (a))engine=innodb;
  2. Query OK, 0 rows affected (0.24 sec)
  3. mysql> begin
  4. -> ;
  5. Query OK, 0 rows affected (0.00 sec)
  6. mysql> insert into t select 1;
  7. Query OK, 1 row affected (0.00 sec)
  8. Records: 1  Duplicates: 0  Warnings: 0
  9. mysql> insert into t select 1;
  10. ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
  11. mysql> select * from t;
  12. +---+
  13. | a |
  14. +---+
  15. | 1 |
  16. +---+
  17. 1 row in set (0.00 sec)
  18. mysql>
  19. 可以看到,插入第二条记录的时候,db抛出了1062错误,但是并没有自动回滚,能查出前一条insert的记录,这个时候需要我们手动commit或者rollback

rollback to [savepoint] identifier:与savepoint一起使用,可以把事务回滚到标记点,而不回滚在此标记点之前的任何工作。
 
 set transaction:设置事务的隔离级别,4种事务隔离级别:read uncommitted,read committed,repeatable read,serializable。
 start transaction与begin都可以在mysql命令行下显示的开启一个事务,但是在存储过程中MySQL会自动将begin识别成begin ... end。
 因此在存储过程中,只能用start transaction。

MySQL事务控制语句(学习笔记)的更多相关文章

  1. MySQL基础之事务编程学习笔记

    MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...

  2. MYSQL视图的学习笔记

    MYSQL视图的学习笔记,学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆 课程笔记的综合. 视图及图形化工具   1.       视图的定义 视图就是从一个或多个表中,导出来的表,是一个虚 ...

  3. mySQl数据库的学习笔记

    mySQl数据库的学习笔记... ------------------ Dos命令--先在记事本中写.然后再粘贴到Dos中去 -------------------------------- mySQ ...

  4. Mysql数据库基础学习笔记

    Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...

  5. PHP和MySQL Web开发学习笔记介绍

    前言 从2016年2月1日开始,之后的几个月左右的时间里,我会写一个系列的PHP和MySQL Web开发的学习笔记.我之前一直从事Java语言的开发工作,最近这段时间非常想学习一门语言,就选择了PHP ...

  6. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  7. MySQL属性SQL_MODE学习笔记

    最近在学习<MySQL技术内幕:SQL编程>并做了笔记,本博客是一篇笔记类型博客,分享出来,方便自己以后复习,也可以帮助其他人 SQL_MODE:MySQL特有的一个属性,用途很广,可以通 ...

  8. mySql 基本语法学习笔记

     create database if not exists yang;    drop database if exists yang;     show databases;   show dat ...

  9. mysql性能优化学习笔记-参数介绍及优化建议

    MySQL服务器参数介绍 mysql参数介绍(客户端中执行),尽量只修改session级别的参数. 全局参数(新连接的session才会生效,原有已经连接的session不生效) set global ...

随机推荐

  1. 腾讯旗下网站的很多URL都包含“cgi-bin”,是什么意思?他们后台用什么语言?

    cgi-bin 这很有可能说明后台是C/C++写的. 动态Web技术刚出来的时候, 服务器调用本地应用程序处理http请求的技术. 通常是C/C++程序. 后来有了新的web开发技术后这类用的就比较少 ...

  2. python笔记1-用python解决小学生数学题

    前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为6角,7角,8角,请问你最大的不可支付邮资是多少元? 小编掰着手指头和脚趾头算了下,答案是:1.7元 那么问题来了?为啥是1.7 ...

  3. 2008技术内幕:T-SQL语言基础 单表查询摘记

    这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基础>,书中用到的案例数据库是这个 TSQLFundamentals2008 ,官网给出的连接是这 ...

  4. C#获取网页内容,并且处理正确编码

    控制台调用static void Main(string[] args) { string code = GetEncodings("http://www.cnblogs.com" ...

  5. JavaScript 面向对象编程之一

    一:Class and private And public JS 中的类以 function 进行声明,同时 JS 也支持声明私有 private 和公有 public 成员,只不过跟 C# 不一样 ...

  6. mongodb实现远程连接

    mongodb远程连接配置分为以下4步: 1. 添加管理员账户 > use admin switched to db admin > db.addUser('tank','test'); ...

  7. Spark一个简单案例

    Spark是一个类似Map-Reduce的集群计算框架,用于快速进行数据分析. 在这个应用中,我们以统计包含"the"字符的行数为案例,.为建立这个应用,我们使用 Spark 1. ...

  8. Maintenance Plans(维护计划)详解【转】

    最近试用了下 Sql Server 2008 的    Maintenance Plans( 维护计划 ),感觉很不错很不错.一贯的延续了微软的风格,图形化界面操作,保准你掌握了这个,就能成为半个DB ...

  9. std::vector 两种操作的比较

    swap assign 这里只想说明这三种操作的用处和效率.swap和assign都可以用在将一个vector的内容全部复制给另外一个vector,区别是swap会改变源vector,而assign会 ...

  10. 剑指offer-序列化二叉树

    请实现两个函数,分别用来序列化和反序列化二叉树 以前提交的内存超出了,可能现在要用非递归实现了 #include<iostream> #include<math.h> #inc ...