通过几个实验探索一下mysql for update锁的类型
表结构
CREATE TABLE `test_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `login_name` varchar(20) NOT NULL DEFAULT '', `name` varchar(30) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `idx_login_name` (`login_name`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
记录
引用
insert into `test_user` (`id`, `login_name`, `name`) values('1','zhangsan','张三');
insert into `test_user` (`id`, `login_name`, `name`) values('2','lisi','李四');
insert into `test_user` (`id`, `login_name`, `name`) values('2','lisi','李四');
实验1
session_1
begin; select * from test_user where login_name = 'zhangsan' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 1 | zhangsan | 张三 | +----+------------+--------+
session_2
begin; select * from test_user where login_name = 'zhangsan' for update; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
实验2
session_1
begin; select * from test_user where login_name = 'zhangsan' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 1 | zhangsan | 张三 | +----+------------+--------+ 1 row in set (0.00 sec)
session_2
select * from test_user where login_name = 'lisi' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 2 | lisi | 李四 | +----+------------+--------+ 1 row in set (0.00 sec)
从实验1和实验2可以看出,对于有唯一索引的列,select for update 加的是排他锁,行级锁。锁定后,可以对其他行进行for update的查询
实验3
session_1
begin; select * from test_user where login_name = 'bucunzai' for update; Empty set (0.00 sec)
session_2
begin; select * from test_user where login_name = 'bu4' for update; Empty set (0.00 sec) insert into test_user (login_name,name) values ('bu4','bu2name'); 阻塞等待
session_1
commit; 提交
session_2
Query OK, 1 row affected (20.62 sec) 执行成功
实验4
session_1
begin; select * from test_user where login_name = 'bucunzai' for update; Empty set (0.00 sec)
session_2
select * from test_user where login_name = 'zhangsan' for update; +----+------------+--------+ | id | login_name | name | +----+------------+--------+ | 1 | zhangsan | 张三 | +----+------------+--------+ 1 row in set (0.00 sec) update test_user set name = '张三丰' where login_name = 'zhangsan'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
从实验3和实验4可以看出,for update 语句对于空记录加共享锁,此时其他线程不能插入,可以进行查询操作。 对于已有记录没有加锁,其他线程可以对记录进行修改。
相关推荐
MySQL锁类型以及查询锁表问题、解锁MySQL中select * for update锁表的范围MySQL中select * for update锁表的问题由
MySQL中update操作会自动加锁吗,看了就知道答案!!!
通常情况下,我们会使用以下SQL语句来更新字段值: ...for x in xrange(10): sql = ''' UPDATE mytable SET myfield='value' WHERE other_field='other_value'; ''' 这种方法并没有什么任何错误,
最近有项目需求,需要保证多台机器不拿到相同的数据,后来发现... for update经常导致数据库死锁问题,下面小编给大家介绍mysql 数据库死锁过程分析(select for update),对mysql数据库死锁问题感兴趣的朋友一起学习吧
本文主要是实现 c++ 读写图片到mysql update mysql with c++ update mysql with
主要介绍了mysql update正则替换sql语句的相关资料,需要的朋友可以参考下
系统介绍mysql锁机制
mac上的mysql工具,亲测可用,我的mac版本是10.10.5,贼稳
MySQL for Visual Studio provides access to MySQL objects and data using Microsoft Visual Studio. MySQL for Visual Studio provides
各版本mysql-connector-net及 mysql_for_visualstudio 1.2.9
Mysql事务以及锁原理讲解,方便大家了解mysql事务和锁的原理
MySQL专家认证教材:Oracle Certified Professional: MySQL 5.6 Database Administrator
主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要...
MySQL for Visual Studio provides access to MySQL objects and data using Microsoft Visual Studio. MySQL for Visual Studio provides: Design Time Support Query Designer Stored Routine Debugging Entity ...
mysql for Windows 安装步骤,详细指导步骤截图一应俱全
本文介绍在mysql中使用mysql SELECT FOR UPDATE 语句时的一些问题与解决办法
mysql for linux 安装,教你快速的在linux上面安装mysql服务器
navicat for mysql for mac汉化补丁,解压文件,放入contents\resources内
MySQL认证官方教程:MySQL for Database Administrators Activity Guide