14.3.2.4 Locking Reads  锁定读

如果你的查询数据,然后插入或者更新相关的数据 在同一个事务,

普通的SELECT 语句不足以给予足够保护。

其他事务可以更新或者删除相同的你要查询的记录,InnoDB 支持2种类型的锁定读,提供额外的安全:

1.SELECT ... LOCK IN SHARE MODE 设置一个共享的lock 在任何被读取的记录上。

其他会话可以读记录, 但是不能修改它们直到你的事务提交。

如果这些行中的任何记录被其他会话修改,而没有提交,

你的查询等待直到事务结束,然后使用最新的值。

Session 1:

mysql> update t5 set id=200 where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Session 2: mysql> select * from t5 LOCK IN SHARE MODE;--Hang 对于index records 搜索遇到的,, SELECT ... FOR UPDATE 锁定记录和相关的index entries, 和你执行一个UPDATE 语句一样。其他的事务会被更新堵塞, SELECT ... LOCK IN SHARE MODE,或者读取数据在某个事务隔离级别。 一致性读忽略任何locks 设置在记录上(老本本的记录不会被锁定,它们是通过应用undo logs 来构建) 那些语句是有用的当处理树形结构或者结构化数据, 无论是在单个表里 或者 分散到多个表。 你遍历边缘或者树的分支从一个地方到另一个地方 所有的锁通过LOCK IN SHARE MODE and FOR UPDATE 查询会被释放当事务提交或者回滚 注意: 锁定记录 使用 SELECT FOR UPDATE 只应用在当自动提交关闭时(或者通过开始事务 START TRANSACTION 或者 setting autocommit to 0 如果自动提交被启用,匹配的记录不会被锁定 测试: mysql> show variables like '%commit%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| autocommit | ON CREATE TABLE `t5` (
`sn` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) DEFAULT NULL,
`info` varchar(40) DEFAULT NULL,
PRIMARY KEY (`sn`),
UNIQUE KEY `t5_idx1` (`id`)
) 自动提交开启情况下: Session 1: mysql> select * from t5;
Empty set (0.00 sec) mysql> insert into t5(id,info) values(1,'a1');
Query OK, 1 row affected (0.00 sec) Session 2: mysql> select * from t5;
+----+------+------+
| sn | id | info |
+----+------+------+
| 1 | 1 | a1 |
+----+------+------+
1 row in set (0.00 sec) mysql> 自动提交 /***手工开启事务: Session 1: mysql> START TRANSACTION ;
Query OK, 0 rows affected (0.00 sec) mysql> insert into t5(id,info) values(2,'a2');
Query OK, 1 row affected (0.00 sec) Session 2: mysql> select * from t5;
+----+------+------+
| sn | id | info |
+----+------+------+
| 1 | 1 | a1 |
+----+------+------+
1 row in set (0.00 sec) 看不到之前的修改 使用例子: 假设你需要插入一条新的记录到一个子表, 确保子表的记录在父表中也有。 你的应用代码可以确保在整个操作过程中引用的完整性。

14.3.2.4 Locking Reads 锁定读的更多相关文章

  1. 14.5.2.4 Locking Reads 锁定读:

    14.5.2.4 Locking Reads 锁定读: 如果你查询数据然后插入或者修改相关数据在相同的事务里, 常规的SELECT 语句不能给予足够的保护. 其他事务可以修改或者删除你刚查询相同的记录 ...

  2. 一步一步学MySQL-一致性非锁定读和锁定读

    一致性非锁定读(consistent nonlocking read) 一致性非锁定读是值InnoDB存储引擎通过多版本控制(multi versioning)的方式来读取当前执行时间数据库中的数据. ...

  3. SELECT ... FOR UPDATE or SELECT ... FOR SHARE Locking Reads session

    小结: 1.注意使用限制 Locking reads are only possible when autocommit is disabled (either by beginning transa ...

  4. 转 MYSQL SELECT ... FOR UPDATE and SELECT ... LOCK IN SHARE MODE Locking Reads

    原文: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html In some circumstances, a consis ...

  5. Mysql 锁定 读情况

    在一个事务中,标准的SELECT语句是不会加锁,但是有两种情况例外. SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE SELECT ... LO ...

  6. 14.3.2.1 Transaction Isolation Levels 事务隔离级别

    14.3.2 InnoDB Transaction Model InnoDB 事务模型 14.3.2.1 Transaction Isolation Levels 事务隔离级别 14.3.2.2 au ...

  7. SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录

    14.5.2.4 Locking Reads 锁定读: 如果你查询数据然后插入或者修改相关数据在相同的事务里, 常规的SELECT 语句不能给予足够的保护. 其他事务可以修改或者删除你刚查询相同的记录 ...

  8. MySQL SELECT语法(一)SELECT语法详解

    源自MySQL 5.7 官方手册:13.2.9 SELECT Syntax SELECT的语法如下: SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIO ...

  9. MySQL error : Deadlock found when trying to get lock; try restarting transaction

    在使用 MySQL 时,我们有时会遇到这样的报错:“Deadlock found when trying to get lock; try restarting transaction”. 在 14. ...

随机推荐

  1. 知识点1-3:MVC设计模式

    MVC代表模型-视图-控制器(Model-View-Controller),起源于20世纪70年代的Smalltalk开发社区,2003年起随着Ruby on Rails的出现才在Web上流行使用. ...

  2. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]

    原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇] 对于WCF服务端元数据架构体系来说,通过MetadataExporter将服务的终结点导出成MetadataSet(参考< ...

  3. docker学习笔记5:利用commit命令创建镜像 和 删除本地镜像

    一.概述 创建镜像有两种方法,一是用commit命令,二是用dockerfile方法(这个更常用,在下面文章介绍).本章介绍commit方法. 在介绍commit命令前,我们先回顾下对代码的版本控制, ...

  4. cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞

    上篇文章实现了坦克与地图碰撞的检测, 这篇我们继续完成子弹和地图的碰撞检测. 1.先设计一个子弹类Bullet,如下所示: class Bullet : public CCSprite { publi ...

  5. Route@简单应用

    路由的简单应用(生成URL) 这篇文章讲的核心问题是利用路由系统生成URL但是我们,但是我们不是仅仅生成URL,我们的超链接的href属性中,我们在跳转的时候,都需要URL,我们要将的就是在这些实际情 ...

  6. 在Windows下编译OpenSSL(VS2005和VC6)

    需要说明的是请一定安装openssl-0.9.8a .  openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装Activ ...

  7. 不用SWIG,Go使用C++代码的方式

    将C++代码用C作一次封装,就可以让Go调用了. 这是一个C++头文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #ifndef CGO_CPPGO_C ...

  8. 使用boost中的property_tree实现配置文件

    property_tree是专为配置文件而写,支持xml,ini和json格式文件   ini比较简单,适合简单的配置,通常可能需要保存数组,这时xml是个不错的选择.   使用property_tr ...

  9. sqlserver05 字符串拆分

    -- 规则:将 gs-abc-aa-aa 拆分为一下字符 -- gs-abc-aa-aa -- gs-abc-aa -- gs-abc -- gs select * from dbo.f_split( ...

  10. js实现密码强度验证

    <html> <head> <meta http-equiv="content-type" content="text/html" ...