`
xitonga
  • 浏览: 588245 次
文章分类
社区版块
存档分类
最新评论

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语句及其知识要点,采用思维导图的方式记录,逻辑清晰,分类准确,方便查找所需的知识点,也方便随时打开查阅,可以拿来复习、学习、或者查阅相应语句,也可以...

    MySQL5000字超详细笔记

    这份笔记的亮点在于它详细解释了SQL语句的各个部分,包括DDL、DML和DQL操作,以及用户权限控制和事务控制语言的应用。 对于初学者来说,这份笔记提供了坚实的基础,帮助他们理解关系型数据库的工作原理。而对于经验...

    mysql基础笔记

    mysql 学习基础笔记 .Mysql 基础操作 1.1 mysql表复制 1.2 mysql索引 1.3 mysql试图 1.4 mysql 内置函数 ... 1.6 mysql事务处理 1.7 mysql存储 1.8 mysql触发器(trigger) 1.9 重排auto_increment值

    Mysql学习笔记

    Mysql学习笔记 mysql使用mysql协议,mysql协议是明文的。 SQL查询语句,原名称为sequel,后来改为SQL。 SQL语言的组成部分: DDL DML 完整性定义语言(DDL的一部分) 视图定义 事务控制 嵌入式SQL(嵌入到其他开发...

    MySQLDBA运维笔记.pdf

    1.7 关于 mysql 管理员设置..................................................................................................22资源由 www.eimhe.com 美河学习在线收集分享 1.7.1 为管理员 root 用户设置密码...

    聊聊MySQL事务的特性和隔离级别

      此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb。首先先讲讲事务的概念,在《高性能MySQL》第三版中其对事务的描述是这样的: 事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果...

    一千行的MySQL学习笔记汇总

    本文详细汇总了MySQL学习中的各类技巧,分享给大家供大家参考。 具体如下: /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ ...

    MySQL面试题经典精华精确.zip

    学习笔记:整理了一些关于MySQL的学习笔记,这些笔记涵盖了MySQL的学习重点和难点,对于准备面试和学习MySQL都非常有帮助。 适用人群: 这份资料适用于所有正在准备MySQL面试的求职者,无论你是初学者还是有一定...

    java学习笔记之sql常用语句

    DDL(Data Definition Language):数据库定义语句;  DML(Data Manipulation Language):用于增删改查数据库中数据;  DCL(Data Control Language)用来向用户赋予/取消对数据...”,但执行mysql语句则需要加“;”

    2009达内SQL学习笔记

    rollback:回溯,回溯到上次操作前的状态,把这次事务操作作废,只有一次(DDL和DCL语句会自动提交,不能回溯)。 可以用commit语句提交,这样就回溯不回了。 set pause on\off :设置分屏(设置不分屏) set pause...

    B站 MySQL学习随手记 全是满满的干货!

    业务级别的MySQL学习与使用 1、数据库分类 1. 关系型数据库(SQL) MySQL,Oracle,SQL Server,DB2,SQLlite 通过表和表之间的,行与列之间的关系进行数据的存储。(例如:学生信息表) 2. 非关系型数据库(NoSQL...

    Java学习笔记-个人整理的

    {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {13.6.1}Wrapper}{199}{subsection.13.6.1} {13.7}DAO}{199}{section.13.7} {13.8}java.util.Date与java.sql.Date比较}{200}{...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 二、 Oracle的数据类型 类型 参数 描述 字符类型...

    Java开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    leetcode会员降价-cpp:该库主要包括C++的基础语法以及C++11新特性等相关知识点的代码

    此学习笔记来源于,库中目前包含的有以下知识 第一章. 基本语法 第二章. 数组与结构体 第三章. 引用与函数的高级用法 第四章. 类与对象 第五章. 文件操作 第六章. 模板 第七章. STL   string容器和vector容器 From...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

Global site tag (gtag.js) - Google Analytics