[关闭]
@JunQiu 2018-09-23T16:46:42.000000Z 字数 1604 阅读 2713

mysql间隙锁+行锁避免幻读

summary_2018/09 mysql


1、日常

1.1、mysql间隙锁+行锁避免幻读研究

2、技术

2.1、mysql间隙锁+行锁避免幻读
2.1.1、RR、Serializable
2.1.2、mysql如何在RR级别解决幻读??
  1. ## 行锁
  2. Record Lock:单个行记录上的锁,我们通常讲的行锁,它的实质是通过对索引的加锁实现;只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。在事务隔离级别为读已提交下,仅采用Record Lock
  3. ## 间隙锁
  4. Gap Lock:锁定一个范围(即记录间的间隙,阻止插入防止幻读的发生),但不包含记录本身。见下图:

  1. mysql> desc t;
  2. +-------+---------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-------+---------+------+-----+---------+-------+
  5. | a | int(11) | YES | | NULL | |
  6. +-------+---------+------+-----+---------+-------+
  7. // 事务A
  8. mysql> begin;
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> select * from t;
  11. +------+
  12. | a |
  13. +------+
  14. | 4 |
  15. | 4 |
  16. +------+
  17. 2 rows in set (0.00 sec)
  18. // 更新或者删除操作,会加gap锁,且由于A不是索引,会锁住全表
  19. mysql> update t set a=2 where a=1;
  20. Query OK, 0 rows affected (0.00 sec)
  21. Rows matched: 0 Changed: 0 Warnings: 0
  22. ---- 事务B ----
  23. mysql> INSERT INTO Persons VALUES (4);
  24. // 陷入锁等待,直到A提交或者lock等待超时
  25. ---- 事务B ----
  26. mysql> select * from t;
  27. +------+
  28. | a |
  29. +------+
  30. | 4 |
  31. | 4 |
  32. +------+
  33. 2 rows in set (0.00 sec)
2.1.3、具体加锁的细节(主键、非索引)
2.1.4、一些思考
2.1.4、比较好的参考资料
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注