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。
最新文章
- ORA-01102: cannot mount database in EXCLUSIVE mode
- DOM与元素节点内联样式
- Web前端新人笔记之了解Jquery
- Spark使用CombineTextInputFormat缓解小文件过多导致Task数目过多的问题
- FATE(费用背包,没懂)
- cuckoo相关
- 第一阶段项目(2 body)
- 在echarts3中使用字符云
- ●POJ 3378 Crazy Thairs
- 理解 Linux 中 `ls` 的输出
- 20180903 - Python Pip 工具下载whl包与离线安装
- js 快速生成数组的方法
- JAVA对mongodb的基本操作
- adv生成控制器手腕位置倾斜原因以及解决方案
- 解决 'Could not convert variant of type (NULL) into type (String)
- C# web服务器被webbench攻击及目现采用的防御措施
- [转]查看linux服务器硬盘IO读写负载
- YAML(摘录)
- POJ - 1821 单调队列优化DP + 部分笔记
- MB Star C3 vs MB Star C4
热门文章
- C# 中的动态创建技术
- Oracle 快速插入1000万条数据的实现方式
- .NET:“事务、并发、并发问题、事务隔离级别、锁”小议,重点介绍:“事务隔离级别";如何影响 “锁”?
- 使用IP访问Mantis显示空白页的解决办法
- coco游戏android.mk
- Redis源代码分析(十二)--- redis-check-dump本地数据库检測
- Maximum Likelihood Method最大似然法
- 【BZOJ】【3239】Discrete Logging
- [14] 齿轮(Gear Wheel)图形的生成算法
- 【转】QT CEF3 消息循环处理