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

news/2024/7/7 7:04:06
               

 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: 0mysql> 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: 0mysql> 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: 0mysql> commit work;Query OK, 0 rows affected (0.00 sec)mysql> select @@versison;ERROR 2006 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id:    205656Current database: testERROR 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 existmysql> 


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: 0mysql> 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。

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow


http://www.niftyadmin.cn/n/3653855.html

相关文章

CSDDN特约专稿:个性化推荐技术漫谈

如果说过去的十年是搜索技术大行其道的十年,那么个性化推荐技术将成为未来十年中最重要的革新之一。目前几乎所有大型的电子商务系统,如Amazon、CDNOW、Netflix等,都不同程度地使用了各种形式的推荐系统。而近来以“发现”为核心的网站正开始…

ORA-12514 TNS listener does not currently know of service r

1,登录报错如下:[oracleoracle_yueworld admin]$ rlwrap sqlplus system/system51st1SQL*Plus: Release 11.2.0.1.0 Production on Thu Dec 3 16:33:26 2015Copyright (c) 1982, 2009, Oracle. All rights reserved.ERROR:ORA-12514: TNS:listener does…

CSDN特约专稿:音乐八宝盒的推荐引擎模式

在在线数字音乐领域中,如何能够真正深入挖掘长尾的价值,采用主动的音乐推荐模式,去帮助用户找到符合自己口味的新音乐,成为一个新的挑战和机会。八宝盒(www.8box.cn)是一个基于音乐分享及偏好而建立起来的S…

zabbix3 0 监控mysql服务器性能实现过程

-->监控思路先在zabbix主机上面配置好mysql服务器的信息,添加好zabbix自带的Template App MySQL模版,然后去mysql服务器上安装agent,再添加mysql监控脚本。1,建立mysql host groups组模板是 zabbix系统提供的,进入 …

JRuby:使Java和Ruby成为一家人

Ruby是现在编程界讨论得正热火朝天的一种语言。这种语言功能强大而且易于使用;同时Ruby还紧密绑定到例如Ruby on Rails等web应用程序开发框架中一、 引言  Ruby是现在编程界讨论得正热火朝天的一种语言。这种语言功能强大而且易于使用;同时Ruby还紧密绑…

JIRA 最新Linux版本 jira6 3 6安装汉化破解以及数据迁移

序言:JIRA 是澳大利亚 Atlassian 公司开发的一款优秀的问题跟踪管理软件工具,可以对各种类型的问题进行跟踪管理,包括缺陷、任务、需求、改进等。JIRA采用J2EE技术,能够跨平台部署。它正被广泛的开源软件组织,以及全球…

NetBeans IDE的新旧键绑定,为什么选择 vi?

“我又回到了100%的工作效率!”Rob 在 openide-dev 邮件列表中高兴地说。他的朋友,社区成员 Antonio 问道“我在哪可以得到这个项目的赠品?”令他们如此兴奋的项目就是 NetBeans IDE 5.5 新的 jVi 插件。这个大家期待着(希望&…

ORA-01652 无法通过128 在表空间 TEMP中 扩展temp段 剖析解决

1,同事说执行sql报错同事在plsql里面执行sql报错,报错信息:ora-01652 无法通过128 (在表空间 TEMP中)扩展temp段,如下图所示:2,查看报错sql语句Sql比较长,而且无法扩展temp字段,那么…