mysql条件查询不存在行,使用for update加锁的分析

原创 2018年04月17日 12:35:49

先介绍一个实际的例子。

有如下的表:

CREATE TABLE `test_2` (
  `id` int(11) NOT NULL,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表中数据如下:

mysql> SELECT * FROM test_2;
+----+------+
| id | name |
+----+------+
|  1 | 1    |
|  6 | 6    |
| 11 | 11   |
| 16 | 16   |
| 21 | 21   |
| 26 | 26   |
| 31 | 31   |
| 36 | 36   |
+----+------+
8 rows in set (0.00 sec)

有两个并发的事务执行相同的SQL:

START TRANSACTION;
SELECT * FROM test_2 WHERE id = 13 FOR UPDATE;
INSERT INTO test_2 VALUES (13, '13');
COMMIT;

出现死锁:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM test_2 WHERE id = 13 FOR UPDATE;
Empty set (0.00 sec)

mysql> INSERT INTO test_2 VALUES (13, '13');
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
mysql> 

该例子和幻读挺类似的。但是for update应该加的是独占锁,而且如果对应的索引是唯一索引加的是行锁,一个事务加锁了,另一个事务应该被阻塞了。但是如果该查询条件对应的记录不存在,加的则是gap锁,该例子中锁的范围是(11,16),不包括11,16,gap是互相兼容的,另一个事务不会阻塞。执行insert语句时,需要insert意向锁,和gap锁是冲突的,所以产生了死锁。




MySQL并发更新数据加锁处理

前阵子一个项目中涉及到了对MySQL数据的并发更新,对于同一个数据记录,使用了并发工具进行测试,结果数据被改乱了。原因是没有对MySQL的数据行进行加锁。而当时我使用的SQL语句类似如下: UPDAT...
  • five3
  • five3
  • 2017-11-24 14:03:16
  • 1641

Mysql加锁过程详解

转载自:http://www.cnblogs.com/metoy/p/5545580.html 1、背景   MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作...
  • u013215018
  • u013215018
  • 2017-05-08 11:47:27
  • 1410

(五)MySQL InnoDB中各类语句加锁方式

MySQL InnoDB中各类语句加锁方式 (一)MySQL InnoDB事务模型 (二)MySQL InnoDB锁模型 (三)MySQL InnoDB非锁定一致性读与锁定读 (四)MySQL...
  • zyz511919766
  • zyz511919766
  • 2015-10-27 17:19:49
  • 6843

mysql中 insert、update、delete锁

对于表的锁的探索 开多个客户端界面 DROP TABLE IF EXISTS `m_user`; CREATE TABLE `m_user` ( `i_id` int(10) unsign...
  • Genius_Ge
  • Genius_Ge
  • 2017-07-26 16:13:51
  • 1651

MySQL加锁处理分析

1    背景    1 1.1    MVCC:Snapshot Read vs Current Read    2 1.2    Cluster Index:聚簇索引    3 ...
  • javastart
  • javastart
  • 2014-10-10 12:39:47
  • 922

mysql数据库 引擎切换, 事务支持,存储过程非线程安全,需加锁

数据库操作 查看数据库引擎:   show engines;   mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。   在[mysq...
  • gredn
  • gredn
  • 2014-04-06 22:19:16
  • 1355

mysql加锁分析

  • 2016年05月19日 16:50
  • 609KB
  • 下载

MySQL 加锁处理分析

原文地址:http://hedengcheng.com/?p=771 1    背景    1 1.1    MVCC:Snapshot Read vs Current...
  • sadfishsc
  • sadfishsc
  • 2013-12-13 16:43:55
  • 8038

Oracle的缓冲区命令

首先 登陆  sqlplus / as sysdba 进入sql命令 输入查询命令 sql> select * from dual; 这时缓冲区存在了一条sql 命令: 1 list (缩写为l命令)...
  • liaomin416100569
  • liaomin416100569
  • 2016-03-09 10:20:17
  • 3002

推荐 mysql insert 加锁流程

INSERT sets an exclusive lock on the inserted row. This lock is an index-record lock, not a next-key...
  • bigtree_3721
  • bigtree_3721
  • 2017-08-08 17:49:28
  • 621
收藏助手
不良信息举报
您举报文章:mysql条件查询不存在行,使用for update加锁的分析
举报原因:
原因补充:

(最多只允许输入30个字)