1.  隐含的执行unlock tables

  如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示:

会话1

会话2

SELECT * FROM country WHERE country='德国';

记录为空

SELECT * FROM country WHERE country='德国';

记录为空

--  对country表进行加 写锁

LOCK TABLE country WRITE;

-- 查询 整个表读取被阻塞

SELECT * FROM country WHERE country='德国';

-- 插入一条记录

INSERT INTO country(country, last_update) VALUES('德国',NOW());

共 1 行受到影响

country_id        country    last_update

2       中国         2018-07-03 18:06:45

7       德国         2018-07-12 17:22:08

查询等待

-- 开始一个新事务

START TRANSACTION;

会话1开始一个新事务时,表锁被释放,可以查询:

SELECT * FROM country;

country_id        country    last_update

2       中国         2018-07-03 18:06:45

7       德国         2018-07-12 17:22:08

  在同一个事务中,最好不要操作不同存储引擎的表, 因为只有commit 和rollback 只能对事务类型的表进行提交和回滚。通常 提交的事务记录会到二进制的日志中, 但如果一个事务中包含非事务类型的表,那么回滚操作也会被记录到二进制日志中,以确保非事务类型表的更新可以被复制到从slave数据库中。

2.  savepoint

  在事务中可以通过定义 savepoint,指定回滚事务的一个部分,但是不能提交提交事务的一个部分, 对于复杂的应用,可以定义多个不同的savepoint 来适应不同的条件,回滚不同的savepoint。如果定义了相同名字的savepoint,则后面定义的savepoint会覆盖之前的定义。对于不再需要使用的savepoint,可以通过release savepoint 来删除savepoint。
  下面举例回滚事务的一个部分,通过定义savepoint来指定需要回滚的事务的位置。

会话1

会话2

SELECT * FROM country WHERE country='德国';

结果为空

SELECT * FROM country WHERE country='德国';

结果为空

-- 启动一个事务 插入一条记录

START TRANSACTION ;

INSERT INTO country(country, last_update) VALUES('德国',NOW());

-- 可以查询到刚插入的记录

SELECT * FROM country WHERE country='德国';

country_id        country    last_update

12     德国         2018-07-12 18:17:12

SELECT * FROM country WHERE country='德国';

结果为空

--  定义savepoint 名为testsavepoint

SAVEPOINT savepoint_test;

-- 继续插入一条记录, 此时事务还会提交

INSERT INTO country(country, last_update) VALUES('日本',NOW());

SELECT * FROM country WHERE country='德国' or country='日本'

结果为空

SELECT * FROM country WHERE country='德国' or country='日本'

country_id        country    last_update

12     德国         2018-07-12 18:17:12

13     日本         2018-07-12 18:20:33

-- 回滚刚才的定义

ROLLBACK TO SAVEPOINT savepoint_test;

SELECT * FROM country WHERE country='德国' OR country='日本'

country_id        country    last_update

12     德国         2018-07-12 18:17:12

SELECT * FROM country WHERE country='德国' or country='日本'

结果为空

-- 提交事务

COMMIT;

SELECT * FROM country WHERE country='德国' OR country='日本'

country_id        country    last_update

12     德国         2018-07-12 18:17:12

SELECT * FROM country

country_id        country    last_update

2       中国         2018-07-03 18:06:45

12     德国         2018-07-12 18:17:12

mysql 开发基础系列21 事务控制和锁定语句(下)的更多相关文章

  1. mysql 开发基础系列20 事务控制和锁定语句(上)

    一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...

  2. (1.3)mysql 事务控制和锁定语句

    (1.3)mysql 事务控制和锁定语句 lock table 参考转载自:https://www.cnblogs.com/kerrycode/p/6991502.html 关键词:mysql loc ...

  3. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  4. mysql事务控制和锁定语句

    MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行页级锁定,对 InnoDB 存储引擎的表进行行级锁定.默认情况下,表锁和行锁都是自动获得的,不 ...

  5. mysql 开发基础系列22 SQL Model

    一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql. sql ...

  6. mysql 开发基础系列18 存储过程和函数(下)

    1. 光标的使用(游标) 在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close. 下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重 ...

  7. mysql 开发基础系列17 存储过程和函数(上)

    一. 概述 存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,可以简化应用开发人员的很多工作,减少数据在数据库与应用服务器之间的传输,提高数据处理效率是有好处的.存储过程和函数的区别在 ...

  8. mysql 开发基础系列14 字符集

    字符集是一套文字符号及其编码,比较规则的集合.第一个字符集是ascll(american standard code for information interchange).  1.  选择合适的字 ...

  9. mysql 开发基础系列10 存储引擎 InnoDB 介绍

    一. 概述: InnoDB存储引擎提供了具有提交,回滚,和崩溃恢复能力的事务安全,对比MYISAM 的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引.它的特点有如下: ...

随机推荐

  1. C++数论板题(弹药科技):Lengendre定理和欧拉函数

    弹药科技 时间限制: 1 Sec 内存限制: 128 MB 题目描述 经过精灵族全力抵挡,精灵终于坚持到了联络系统的重建,于是精灵向人类求助, 大魔法师伊扎洛决定弓}用博士的最新科技来抗敌. 伊扎洛: ...

  2. RAM和ROM

    RAM:随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器.[1]它可以随时读写(刷新时除外,见下文),而且速度很快,通常作为 ...

  3. 手机号读取城市数据库2018年3月excel版

    EXCEL表中是更新到2018年3月份的手机归属地数据库. 手机号读取城市数据库2018年3月excel版.zip

  4. C#遍历SharePoint文档库下所有文档包括文档库中子文件夹下所有文档

    /// <summary> /// 获取取子文件下所有文件 /// </summary> /// <param name="web"></ ...

  5. 第一次OO总结

    作业1——多项式加减法 看到这个名字就开始瑟瑟发抖了,毕竟一年前用C语言让我写这么一个程序都很头疼,什么堆栈啊还有结构都稀里糊涂的,更别说用一个完全没接触过的语言来完成最简单的一次作业.像我这样越老心 ...

  6. python pandas.DataFrame.append

    1.使用append首先要注意的是,你要合并两个DataFrame的columns即列名是否是相同的,不相同的就会报错. 2.我们会发现DataFrame的列名是不能够重复的,而行名(index)是可 ...

  7. Exp2后门原理与实践_20154305 _ 齐 帅

    Exp2后门原理与实践 20154305 _ 齐 帅 2.1简单后门 一.后门工具介绍 1.netcat(nc.ncat) 是一个底层工具,进行基本的TCP UDP数据收发.常被与其他工具结合使用,起 ...

  8. Centos7配置hadoop伪分布式

    修改hostname(可选) 通过下面命令查看hostname信息 hostnamectl 通过下面命令修改hostname hostnamectl set-hostname gy01 如图所示 下面 ...

  9. 2018/9/6 spring框架的整理

    spring知识的巩固整理AOP和ioc概念,以及了解到了为何要使用spring框架的目的,作用:变换资源获取的方向.更像是按需所求.配置bean的方式:利用XML的方式,基于注解的方式两种.1通过全 ...

  10. 【npm】伙计,给我来一杯package.json!不加糖

    前言:夜深了,我熬了一锅热气腾腾的package.json,给大家端上来,希望大家喜欢 json和JS对象的区别 package.json,顾名思义,它是一个json文件,而不能写入JS对象. 所以我 ...