MySQL事务控制语句(学习笔记)
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的时候
- mysql> set names utf8;
- Query OK, 0 rows affected (0.00 sec)
- mysql> create table t(a int, primary key (a))engine=innodb;
- Query OK, 0 rows affected (0.29 sec)
- mysql> select @@autocommit;
- +--------------+
- | @@autocommit |
- +--------------+
- | 1 |
- +--------------+
- 1 row in set (0.00 sec)
- mysql> set @@completion_type=1;
- Query OK, 0 rows affected (0.00 sec)
- mysql> begin;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into t select 1;
- Query OK, 1 row affected (0.00 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> commit work;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into t select 2;
- Query OK, 1 row affected (0.00 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> insert into t select 2;
- ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
- mysql> rollback;
- Query OK, 0 rows affected (0.00 sec)
- # 回滚之后只有1这个记录,而没有2这个记录
- mysql> select * from t;
- +---+
- | a |
- +---+
- | 1 |
- +---+
- 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的连接,如下:
- mysql> set @@completion_type=2;
- Query OK, 0 rows affected (0.00 sec)
- mysql> begin
- -> ;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into t select 3;
- Query OK, 1 row affected (0.00 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> commit work;
- Query OK, 0 rows affected (0.00 sec)
- mysql> select @@versison;
- ERROR 2006 (HY000): MySQL server has gone away
- No connection. Trying to reconnect...
- Connection id: 205656
- Current database: test
- ERROR 1193 (HY000): Unknown system variable 'versison'
- 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:删除事务中的保存点,当时一个保存点也没有时执行这个命令,会报错抛出一个异常,如下所示:
- mysql> begin;
- Query OK, 0 rows affected (0.00 sec)
- mysql> rollback to savepoint t1;
- ERROR 1305 (42000): SAVEPOINT t1 does not exist
- mysql>
innodb存储引擎中的事务都是原子性的,说明以下2种情况:
构成事务的每条语句都会commit,否则事务的每条语句都会rollback,这种保护还会涉及到单调的语句。一条语句要不完成成功要么完全回滚,
但是一条语句失败并不会导致前一条执行的语句自动回滚,他们的工作会保留,需要你手动commit或者rollback。如下:
- mysql> create table t(a int, primary key (a))engine=innodb;
- Query OK, 0 rows affected (0.24 sec)
- mysql> begin
- -> ;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into t select 1;
- Query OK, 1 row affected (0.00 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> insert into t select 1;
- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
- mysql> select * from t;
- +---+
- | a |
- +---+
- | 1 |
- +---+
- 1 row in set (0.00 sec)
- mysql>
- 可以看到,插入第二条记录的时候,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事务控制语句(学习笔记)的更多相关文章
- MySQL基础之事务编程学习笔记
MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...
- MYSQL视图的学习笔记
MYSQL视图的学习笔记,学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆 课程笔记的综合. 视图及图形化工具 1. 视图的定义 视图就是从一个或多个表中,导出来的表,是一个虚 ...
- mySQl数据库的学习笔记
mySQl数据库的学习笔记... ------------------ Dos命令--先在记事本中写.然后再粘贴到Dos中去 -------------------------------- mySQ ...
- Mysql数据库基础学习笔记
Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...
- PHP和MySQL Web开发学习笔记介绍
前言 从2016年2月1日开始,之后的几个月左右的时间里,我会写一个系列的PHP和MySQL Web开发的学习笔记.我之前一直从事Java语言的开发工作,最近这段时间非常想学习一门语言,就选择了PHP ...
- MySQL索引知识学习笔记
目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...
- MySQL属性SQL_MODE学习笔记
最近在学习<MySQL技术内幕:SQL编程>并做了笔记,本博客是一篇笔记类型博客,分享出来,方便自己以后复习,也可以帮助其他人 SQL_MODE:MySQL特有的一个属性,用途很广,可以通 ...
- mySql 基本语法学习笔记
create database if not exists yang; drop database if exists yang; show databases; show dat ...
- mysql性能优化学习笔记-参数介绍及优化建议
MySQL服务器参数介绍 mysql参数介绍(客户端中执行),尽量只修改session级别的参数. 全局参数(新连接的session才会生效,原有已经连接的session不生效) set global ...
随机推荐
- QQclient团队博客
Windows 8 视频採集 http://impd.tencent.com/?p=25 句柄泄漏检測工具的实现原理 http://impd.tencent.com/?p=29
- 如何让WCF服务更好地支持Web Request和AJAX调用
WCF的确不错,它大大地简化和统一了服务的开发.但也有不少朋友问过我,说是在非.NET客户程序中,有何很好的方法直接调用服务吗?还有就是在AJAX的代码中(js)如何更好地调用WCF服务呢? 我首先比 ...
- Thinkpad T440p安装Linux的种种问题(by quqi99)
作者:张华 发表于:2014-05-08 版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99 ) Thi ...
- C#编程(十)----------C#预处理器
原文链接:http://blog.csdn.net/shanyongxu/article/details/46491757 C#中的预处理器指令 #IF 如果 C# 编译器遇到最后面跟有 #endif ...
- tomcat sso 配置
源: http://www.oecp.cn/hi/single/blog/349 为了实现单点登录,做了个CAS SSO单点登录实例,经过反复的琢磨和修改终于成功了,现将CAS SSO单点登录实例详细 ...
- 关于 json 单引号和双引号区别--请使用双引号
双引号才是json 的标准,单引号是不规范的(虽然在js 中是行的通的)! 由于某些原因,在将js json数据传到as 中处理的时候出现了“无效的json解析输入” ,于是查找了一下js参数是否有问 ...
- 《mahout实战》
<mahout实战> 基本信息 原书名:Mahout in action 作者: (美)Sean Owen Robin Anil Ted Dunning Ellen Fr ...
- IOS tableview 横向滚动
1. UITableView 设置 CGRect tableViewRect = CGRectMake(0.0, 0.0, 50.0, 320.0);self.tableView = [[UITabl ...
- 【BZOJ】【2750】【HAOI2012】Road
最短路+拓扑序DP orz zyf & lyd 统计每条边在多少条最短路径上……其实可以统计 有多少条最短路径经过了x,以及y出发到达任意一个结束点有多少种走法(沿最短路) 我们可以用Dijk ...
- C语言编译器不检查数组下标越界
这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以 ...