在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的时候

[sql] view plaincopy
  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的连接,如下:

[sql] view plaincopy
  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:删除事务中的保存点,当时一个保存点也没有时执行这个命令,会报错抛出一个异常,如下所示:

[sql] view plaincopy
  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。如下:

[sql] view plaincopy
  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 事务控制语句(TCL)

    什么是事务? 一个或者一组 sql 语句组成一个执行单元,这个执行单元要么全部执行,要么全部都不执行,在这个单元中每个 sql 语句都是相互依赖的.整个单元作为一个不可分割的整体,如果单元中的某条 s ...

  2. MySQL 学习笔记(9)— 事务控制语句、事务属性以及并发和隔离级别

    1. 事务概念 事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的 MySQL 操作要么完全执行,要么完全不执行. 下面是关于事务处理需要知道的几个术语: ...

  3. mysql begin rollback_事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句

    事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作.因此开始一个事务,必须使用BEGIN.START TRANSACTION,或者执行SE ...

  4. MySQL(InnoDB剖析):42---事务之(事务控制语句:begin、commit、rollback、savepoint、transaction)

    一.事务的自动提交 默认情况下,没有使用begin显式开启事务,事务都是自动提交的 autocommit变量 该变量用于控制SQL语句是否自动提交(auto commit) 默认值为1,表示自动提交 ...

  5. DB-MySQL:MySQL 事务

    ylbtech-DB-MySQL:MySQL 事务 1.返回顶部 1. MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人 ...

  6. ci mysql 事务_MySQL事务-学习笔记

    MySQL事务-学习笔记 MySQL事务 事务的意义 案例:银行转账过程 A向B转账500,A原来有1000,B有500. 分析: SQL处理过程: A 减少 500 B 增加 500 以上两点必须同 ...

  7. mysql事务并发控制_MySQL之事务及并发控制

    本节索引: 一.事务Transaction 二.事务的隔离级别 三.并发控制 四.MVCC-多版本的并发控制协议 一.事务 什么是事务? 事务Transactions:一组原子性的SQL语句,或一个独 ...

  8. 事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句

    事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作.因此开始一个事务,必须使用BEGIN.START TRANSACTION,或者执行SE ...

  9. 解决MySQL事务未提交导致死锁报错 避免死锁的方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/xuheng8600/article/d ...

最新文章

  1. mysql计算两gps坐标的距离_mysql 计算两坐标间的距离
  2. c#之旅--第六天(类,对象,方法)
  3. c++ 32位有符号的整数_【LeetCode】字符串分类字符串转换整数 (atoi)
  4. J2EE应用与移动互联网-写在前头
  5. apache.commons.lang.StringUtils 使用心得
  6. 生活之难:生活到底难在哪里
  7. docker搭建pxc集群
  8. python中调用函数no module named 'utilities'_python错误:No module named setuptools 解决方法...
  9. mysql 只有 .ibd_mysql数据库被破坏,只剩下ibd文件时如何恢复
  10. C#EasyHook例子C# Hook 指定进程C#注入指定进程 z
  11. Protel使用的60个问题和解答
  12. 蓝牙耳机播放音频无声问题的解决方案
  13. JNA实战系列:JNA与C语言中的数据类型映射以及复杂结构体传参示例
  14. Linux常见系统故障排除
  15. 对自定义View的Measure和onMeasure的一点心得
  16. class path resource [applicationContext.xml] cannot be opened because it does not exist,jar包缺失
  17. Excel如何从单元格中提取数值
  18. 每个计算机主机只有一个硬盘吗,电脑多加一个硬盘需要重装系统吗? 电脑如何新增加一块硬盘...
  19. 如何写出公众号爆文?分享你一份爆文写作秘籍
  20. 云计算的优点,主要包含哪几个方面?

热门文章

  1. 内网渗透--获取其他电脑相册
  2. sql的limit用法
  3. mybaitplus 根据id批量进行修改_批量重命名工具
  4. am5718_基于TI AM5718 车牌识别系统解决方案 - 飞凌嵌入式行业资讯 - 保定飞凌嵌入式技术有限公司...
  5. list对oracle结果集排序了_详解SQL窗口函数和分组排序函数
  6. c语言简单的模拟坐标,C语言模拟实现简单扫雷游戏
  7. java群发图文消息_使用Java语言开发微信公众平台(四)——图文消息的发送与响应...
  8. k歌的录音伴奏合成技术如何实现_2019年中国在线K歌行业市场现状,在线K歌用户女性占比较高...
  9. 2sin30°在python中如何表示_如何在python中实现以下派生公式?
  10. java 异常 最佳实践_关于JAVA异常处理的20个最佳实践