MySQL数据库的事物
一、首先看一下student 表里的数据
二、输入start transaction 开启事务
三、更新第一行数据,然后查看结果,发现更新成功了。
四、注意看了,这里就开始回滚了。输入rollback. 然后再查看第一行的数据,可以发现之前跟新的数据变回去了。
五、最后我们查看整个表,可以看到还是和之前一样。
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。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/taneeaj
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24