InnoDB 支持 transaction ,MyISAM 不支持。

索引:

  1. Changing the Default Commit Behavior
  2. SAVEPOINT 与 ROLLBACK TO
  3. COMMIT 与 ROLLBACK

When working with transactions and transaction processing, there are a few keywords that'll keep reappearing. Here are the terms you need to know:

  • Transaction A block of SQL statements

  • Rollback The process of undoing specified SQL statements

  • Commit Writing unsaved SQL statements to the database tables

  • Savepoint A temporary placeholder in a transaction set to which you can issue a rollback (as opposed to rolling back an entire transaction)

有点类似于游戏里的存档,我们在什么时候需要存档呢?

一般是在挑战 BOSS 之前、或者结束游戏的时候,总之是很重要的事情、而且失败之后代价很巨大。我们可以把 挑战 BOSS 这件事情叫做“事务transaction”。在挑战前的那个存档时间点叫做“保存点savepoint”,如果你 GG 了重新去读档就是“回滚rollback”了。

再比如说,实际生活中给人转账,在我确认转账之后,银行系统首先会检查我的账户上有没有足够的钱,然后减去我要转出的金额,如果在这个时候银行系统突然宕机了(假设),那转出去的钱是不是不翼而飞了呢?。。。显然不会,银行系统在做这一系列事情之前肯定会预先存档,万一有意外直接读档回归到什么都没有做的时候就好了。

下面是一个简单的例子:

mysql> SELECT * FROM pet;
+--------+----------+-----------+-----------+
| pet_id | pet_type | pet_name | master_id |
+--------+----------+-----------+-----------+
| 8881 | NULL | 楗?《 | 1001 |
| 8882 | dog | 灏忕櫧 | 1002 |
| 8883 | cat | 鑰侀粍 | 1003 |
+--------+----------+-----------+-----------+
3 rows in set (0.00 sec) mysql> START TRANSACTION; -- 存档,下面要开始做重要的事情了
Query OK, 0 rows affected (0.00 sec) mysql> DELETE FROM pet;
Query OK, 3 rows affected (0.00 sec) mysql> SELECT * FROM pet;
Empty set (0.00 sec) mysql> ROLLBACK; -- 读档
Query OK, 0 rows affected (0.01 sec) mysql> SELECT * FROM pet;
+--------+----------+-----------+-----------+
| pet_id | pet_type | pet_name | master_id |
+--------+----------+-----------+-----------+
| 8881 | NULL | 楗?《 | 1001 |
| 8882 | dog | 灏忕櫧 | 1002 |
| 8883 | cat | 鑰侀粍 | 1003 |
+--------+----------+-----------+-----------+
3 rows in set (0.00 sec)

记住ROLLBACK只能用于回滚 UPDATE、DELETE、INSERT ,而不能回滚 DROP 和 CREATE 。

Changing the Default Commit Behavior

As already explained, the default MySQL behavior is to automatically commit any and all changes. In other words, any time you execute a MySQL statement, that statement is actually being performed against the tables, and the changes made occur immediately. To instruct MySQL to not automatically commit changes, you need to use the following statement:

SET autocommit=0;

PS. 这个设置仅对当前连接有效,不是全局、持久的。

默认状态下除非用了 

START TRANSACTION;

否则每一条 SQL;都是直接被提交的。

看下面的例子:

mysql> SET autocommit=;
Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
row in set (0.00
sec)

mysql> SELECT * FROM pet;
+--------+----------+-----------+-----------+
| pet_id | pet_type | pet_name | master_id |
+--------+----------+-----------+-----------+
| 8881 | NULL | 楗?《 | 1001 |
| 8882 | dog | 灏忕櫧 | 1002 |
| 8883 | cat | 鑰侀粍 | 1003 |
+--------+----------+-----------+-----------+
3 rows in set (0.00 sec) mysql> INSERT INTO pet(pet_name, master_id)
-> VALUES ('老黄', 234);
Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM pet; -- 说好不自动提交呢?。。。
+--------+----------+-----------+-----------+
| pet_id | pet_type | pet_name | master_id |
+--------+----------+-----------+-----------+
| 8881 | NULL | 楗?《 | 1001 |
| 8882 | dog | 灏忕櫧 | 1002 |
| 8883 | cat | 鑰侀粍 | 1003 |
| NULL | animal | 老黄 | |
+--------+----------+-----------+-----------+
4 rows in set (0.00 sec)

就像上面所看到的,我们虽然没有 commit ,但改变还是发生了不是吗?。。但是实际上并没有“真正”提交,断开重连(或者同时再开启一个并行连接也行,可以用这个方法测试一下mysql的并发机制:当某个连接拿到某个表的锁之后,另外一个连接操作这张表就需要等待):

mysql> ^CCtrl-C -- exit!
Aborted
root@xkfx:~# mysql -uroot -p
mysql> USE mysqlCrash; SELECT * FROM pet;
Database changed
+--------+----------+-----------+-----------+
| pet_id | pet_type | pet_name | master_id |
+--------+----------+-----------+-----------+
| 8881 | NULL | 楗?《 | 1001 |
| 8882 | dog | 灏忕櫧 | 1002 |
| 8883 | cat | 鑰侀粍 | 1003 |
+--------+----------+-----------+-----------+
3 rows in set (0.00 sec)

SAVEPOINT 与 ROLLBACK TO

SAVEPOINT delete1; -- 必须在事务内哦
ROLLBACK TO delete1; -- 在事务结束( ROLLBACK / ROLLBACK TO / COMMIT )之后,保存点会被自动释放,当然也可以通过 RELEASE SAVEPOINT 手动释放。

COMMIT 与 ROLLBACK

1、commit:整个事务的所有更改永久保存

2、rollback:撤销事务所做的更改

commit后不能回滚,但是如果你是9i或以上版本可以使用flashback来找回原来的数据。
在一个事务中,rollback和commit都代表结束一个事务。要么回滚,要么提交。他们是在一个等级上的命令。rollback可以写在commit之前,但是commit的数据就不能rollback了。 --- radioxhk

MySQL Crash Course #18# Chapter 26. Managing Transaction Processing的更多相关文章

  1. MySQL Crash Course #20# Chapter 28. Managing Security

    限制用户的操作权限并不是怕有人恶意搞破坏,而是为了减少失误操作的可能性. 详细文档:https://dev.mysql.com/doc/refman/8.0/en/user-account-manag ...

  2. MySQL Crash Course #12# Chapter 18. Full-Text Searching

    INDEX 由于性能.智能结果等多方面原因,在搜索文本时,全文搜索一般要优于通配符和正则表达式,前者为指定列建立索引,以便快速找到对应行,并且将结果集智能排序.启用查询扩展可以让我们得到未必包含关键字 ...

  3. MySQL Crash Course #13# Chapter 21. Creating and Manipulating Tables

    之前 manipulate 表里的数据,现在则是 manipulate 表本身. INDEX 创建多列构成的主键 自动增长的规定 查看上一次插入的自增 id 尽量用默认值替代 NULL 外键不可以跨引 ...

  4. MySQL Crash Course #11# Chapter 20. Updating and Deleting Data

    INDEX Updating Data The IGNORE Keyword Deleting Data Faster Deletes Guidelines for Updating and Dele ...

  5. MySQL Crash Course #10# Chapter 19. Inserting Data

    INDEX BAD EXAMPLE Improving Overall Performance Inserting Multiple Rows INSTEAD OF Inserting a Singl ...

  6. MySQL Crash Course #06# Chapter 13. 14 GROUP BY. 子查询

    索引 理解 GROUP BY 过滤数据 vs. 过滤分组 GROUP BY 与 ORDER BY 之不成文的规定 子查询 vs. 联表查询 相关子查询和不相关子查询. 增量构造复杂查询 Always ...

  7. MySQL Crash Course #04# Chapter 7. 8 AND. OR. IN. NOT. LIKE

    索引 AND. OR 运算顺序 IN Operator VS. OR NOT 在 MySQL 中的表现 LIKE 之注意事项 运用通配符的技巧 Understanding Order of Evalu ...

  8. MySQL Crash Course #01# Chapter 1. 2 概念. Primary key

    索引 database table schema Primary Key MySQL 书的第一章介绍一些基本的概念.理解数据库是掌握 MySQL 非常重要的一个部分. 第二章简单介绍了 MySQL 以 ...

  9. MySQL Crash Course #21# Chapter 29.30. Database Maintenance & Improving Performance

    终于结束这本书了,最后两章的内容在官方文档中都有详细介绍,简单过一遍.. 首先是数据备份,最简单直接的就是用 mysql 的内置工具 mysqldump MySQL 8.0 Reference Man ...

随机推荐

  1. Spring Framework框架容器核心源码逐步剖析

    目录 构建Spring环境 Spring 版本 5.1.3.RELEASE 测试类 Spring 配置文件 测试方法Main 快速进入Debug查看IOC容器构建源码 Spring IOC源码步骤分析 ...

  2. T49

    明天参加媳妇朋友的婚礼.今天晚上的火车,下班后匆忙的打了个的,正好到的哥交接班的时间拦了几辆车都不拉火车站!无奈-五分钟后打上车接上媳妇去火车站!正值五中学生放假路上各种堵!安阳这四线城市什么时候变的 ...

  3. Oracle 分析函数的使用(主要是rollup用法)

    分析函数是oracle 8.1.6中就引入的一个全新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现在 ...

  4. 【紫书】Undraw the Trees UVA - 10562 递归,字符串

    题意:给你画了一颗树,你要把它的前序输出. 题解:读进到二维数组.边解析边输出. 坑:少打了个-1. #define _CRT_SECURE_NO_WARNINGS #include<cstri ...

  5. HDU - 5818 Joint Stacks 比较大の模拟,stack,erase

    https://vjudge.net/problem/HDU-5818 题意:给你两个栈AB,有常规push,pop操作,以及一个merge操作,merge A B 即将A.B的元素按照入栈顺序全部出 ...

  6. ItunesConnect:上传完二进制文件后在构建版本中找不到

    最近经常遇到上传完二进制文件后在构建版本中找不到的情况: 环境:Xcode 8.2 (8C38) 大致有几种原因,可以按照以下步骤排查下. 排查步骤: 1.检查使用的权限,并info.plist文件中 ...

  7. python 基础 集合

    集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 交集 并集 差集 子集  对称差集 list ...

  8. SQLSERVER数据导入到MYSQL

    SQLSERVER数据导入到MYSQL http://hi.baidu.com/luck001221/item/cb4462299f9ea79ab73263d2?qq-pf-to=pcqq.group ...

  9. 001-window版redis安装

    一.参考地址 官方地址:https://redis.io/ windows版本[学习使用]:https://github.com/MicrosoftArchive/redis 二.windows版re ...

  10. vue.js常用的

    <input v-model.number="age" type="number"> //自动将用户的输入值转为数值类型 <input v-m ...