MYSQL教程mysql SELECT FOR UPDATE语句使用示例
《MYSQL教程mysql SELECT FOR UPDATE语句使用示例》要点: 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT quantity FROM products WHERE id=3; UPDATE products SET quantity = 1 WHERE id=3; ? 为什么不平安呢? 少量的状况下或许不会有问题,但是大量的数据存取「铁定」会出问题. 如果我们需要在quantity>0 的情况下才能扣库存,假设程序在第一行SELECT 读到的quantity 是2,看起来数字没有错,但是当MySQL 正准备要UPDATE 的时候,可能已经有人把库存扣成0 了,但是程序却浑然不知,将错就错的UPDATE 下去了. 因此必须透过的事务机制来确保读取及提交的数据都是正确的. 于是我们在MySQL 就可以这样测试: 代码如下: SET AUTOCOMMIT=0; BEGIN WORK; SELECT quantity FROM products WHERE id=3 FOR UPDATE;? 此时products 数据中id=3 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行 UPDATE products SET quantity = '1' WHERE id=3 ; COMMIT WORK; 提交(Commit)写入数据库,products 解锁. 注1: BEGIN/COMMIT 为事务的起始及结束点,可使用二个以上的MySQL Command 视窗来交互观察锁定的状况. 注2: 在事务进行当中,只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 同一笔数据时会等待其它事务结束后才执行,一般SELECT ... 则不受此影响. 注3: 由于InnoDB 预设为Row-level Lock,数据列的锁定可参考这篇. 注4: InnoDB 表单尽量不要使用LOCK TABLES 指令,若情非得已要使用,请先看官方对于InnoDB 使用LOCK TABLES 的说明,以免造成系统经常发生死锁. MySQL SELECT ... FOR UPDATE 的Row Lock 与Table Lock SELECT * FROM products WHERE id='3' FOR UPDATE; ? 例2: (明确指定主键,若查无此数据,无lock) 代码如下: SELECT * FROM products WHERE id='-1' FOR UPDATE; ? 例2: (无主键,table lock) 代码如下: SELECT * FROM products WHERE name='Mouse' FOR UPDATE; ? 例3: (主键不明确,table lock) 代码如下: SELECT * FROM products WHERE id<>'3' FOR UPDATE; ? 例4: (主键不明确,table lock) 代码如下: SELECT * FROM products WHERE id LIKE '3' FOR UPDATE; ? 注1: FOR UPDATE 仅适用于InnoDB,且必需在事务区块(BEGIN/COMMIT)中才能生效. 注2: 要测试锁定的状况,可以利用MySQL 的Command Mode,开二个视窗来做测试. 例 代码如下: MySQL update && select CREATE TABLE `testupdate` ( ? `id` bigint(20) NOT NULL AUTO_INCREMENT, ? `val` bigint(20) NOT NULL DEFAULT '0', ? PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 update testupdate set val = val+1 where id = 1 and @value := val+1; select @value; ? 欢迎参与《MYSQL教程mysql SELECT FOR UPDATE语句使用示例》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Mysql学习一段主被叫信息的mysql sql代码解析
- MYSQL数据库在centOS 7安装mysql 5.7的详细教程
- mysql 定时任务的使用
- Mysql实例MySQL中预处理语句prepare、execute与deallocate的
- Mysql学习MySQl数据库必知必会sql语句(加强版)
- Mysql必读Mysql 5.7.17 winx64在win7上的安装教程
- MYSQL数据库MySQL 5.5.x my.cnf参数配置优化详解
- mySQL Replication:主数据库名称是否必须与从属数据库名称
- mysql-了解Sequelize中的关联
- MySQL 存储过程中使用 WHILE 循环语句