Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
CS-Notes
提交
4b0db3f5
C
CS-Notes
项目概览
wushizhenking
/
CS-Notes
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
CS-Notes
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
4b0db3f5
编写于
8月 08, 2018
作者:
K
Keqi Huang
提交者:
GitHub
8月 08, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update 数据库系统原理.md
上级
93a9fe11
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
4 addition
and
4 deletion
+4
-4
notes/数据库系统原理.md
notes/数据库系统原理.md
+4
-4
未找到文件。
notes/数据库系统原理.md
浏览文件 @
4b0db3f5
...
...
@@ -389,11 +389,11 @@ MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题
## Gap Locks
锁定一个范围内的索引,例如当一个事务执行以下语句,其它事务就不能在 t.c 中插入 15
。
间隙锁锁住的是多行,是一个数据范围。间隙锁主要是为了防止出现幻读,但是它会把锁定范围扩大,有时候也会给我们带来麻烦。在数据库参数中,控制间隙锁的参数是
```innodb_locks_unsafe_for_binlog```
, 这个参数默认值是 OFF,也就是启用间隙锁,它是一个bool值,当值为 true 时表示 disable 间隙锁。那为了防止间隙锁是不是直接将
```innodb_locaks_unsafe_for_binlog```
设置为
```true```
就可以了呢?不一定!而且这个参数会影响到主从复制及灾难恢复,这个方法还尚待商量
。
```
sql
SELECT
c
FROM
t
WHERE
c
BETWEEN
10
and
20
FOR
UPDATE
;
```
间隙锁的出现主要集中在同一个事务中先 delete 后 insert 的情况下,当我们通过一个参数去删除一条记录的时候,如果参数在数据库中存在,那么这个时候产生的是普通行锁,锁住这个记录,然后删除,最后释放锁。如果这条记录不存在,问题就来了,数据库会扫描索引,发现这个记录不存在,这个时候的 delete 语句获取到的就是一个间隙锁,然后数据库会向左扫描扫到第一个比给定参数小的值,向右扫描扫描到第一个比给定参数大的值,然后以此为上下界限构建一个区间,进而锁住整个区间内的数据,一个特别容易出现死锁的间隙锁诞生了。
通过修改
```innodb_locaks_unsafe_for_binlog```
参数来取消间隙锁从而达到避免这种情况的死锁的方式尚待商量,那就只有修改代码逻辑,存在才删除,尽量避免去删除不存在的记录。
## Next-Key Locks
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录