如果同一条记录同时多个进程可能对不同的字段进行修改,怎么保证列锁?
2017-09-17 10:25
741 查看
如果同一条记录同时多个进程可能对不同的字段进行修改,怎么保证列锁?
数据库目前的锁机制有没有办法解决这种并发问题关注者
13
被浏览
652
添加评论
分享
邀请回答
关注问题写回答
3 个回答
默认排序郁白
分布式与数据库,秋名山公爵
5 人赞同了该回答
没听说有列锁的机制,主流的方式就是行锁。
我觉得你这种需求可以归到“热点行”优化上来,秒杀场景下的库存扣减就是最典型的“热点行”事务,有两个优化方法:第一数据库可以将可能冲突的plan放在同一个线程排队,减少锁冲突引起的唤醒和忙等代价;另外就是可以使用“early lock release”的方式,在事务确定可以提交的情况下,不等待刷redolog而提前释放行锁,使得修改同一行的多个事务,有可能在一次group commit内提交,当然前提是这是一条auto commit的事务,而非交互型事务。当时做Oceanbase0.4版本时已经实现了这两个优化。
发布于 2016-08-21
5
2 条评论
分享
收藏
感谢
江星池
主流传统数据库如Oracle、DB2之类,还不支持。 最小粒度是行锁。 不会是列锁。 即使你写了 select ... for update of col1
发布于 2016-09-22
0
添加评论
分享
收藏
感谢
机智飞
在赌场搞机器学习的程序员
谢邀。
我不敢断言目前是否有数据库实现了字段锁,但这种锁一定是非实用锁。
当我们尝试加细锁的粒度时,一定是当前的粒度无法充分应对竞态的频繁发生。字段锁可以缓解的是"多个事务修改某一记录的不同字段引起的阻塞",而不是相同字段上的阻塞。这个时候建议题主反过来想一想,解决这个问题,一定要用字段锁吗?分表就可以了。
每一次加细锁的粒度都是对数据库存储引擎设计的挑战。一方面它极大提高了系统的复杂度,另一方面,维护细粒度锁产生的内存对象也极大地增加了系统的overhead。从表锁,页锁向行锁跨越的历史可以明确地证实这一点。
至于如何实现字段锁,我提出两个问题给题主用来思考。
1、对于请求修改两个不同变长字段的事务A,B来说,它们之间一定不会彼此阻塞吗?
2、两个事务并发修改不同字段时,系统宕机,如何回滚?回滚时都需要哪些数据结构?
发布于 2016-08-21
0
收起评论
分享
收藏
感谢
5 条评论
切换为时间排序知乎用户 (提问者)1
年前
这个需求不是我现实开发中刚遇到的,是一个面试中被问到,当时没回答上来,后来自己思考了一下也没想到好办法。被你这么一分析,确实就算有这个列锁也不一定就是利大于弊的事情。第一个问题可以通过设计来避免,第二个暂时想不到,要么就相关事务全部回滚。
赞
回复
踩
举报
机智飞 (作者) 回复知乎用户 (提问者)1
年前
我提问题的目的就是"你瞧,加了字段锁效率反而更低"。另外,第二个问题,需要增加字段锁表,字段锁实例,日志项等数据结构,而且有额外数据结构就要有额外算法支持。对于实现通用字段锁这个需求,个人感觉系统复杂度已经不在可控范围了。
赞
查看对话
回复
踩
举报
知乎用户 (提问者) 回复机智飞 (作者)1
年前
那在你看来,如果面试遇到这种问题,比较好的回答应该是什么
赞
查看对话
回复
踩
举报
机智飞 (作者)1
年前
这种做法不现实,原因是blablabla,alternatives可以有分表,……等等
赞
回复
踩
举报
知乎用户 (提问者) 回复机智飞 (作者)1
年前
好,多谢你的 回答。
赞
相关文章推荐
- 如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录
- 转载:如何写个SQL语句查询一个字段里是否有重复记录如果有只读取其中一条记录
- 如何编写一条SQL实现根据某个字段的条件对某个字段进行不同的update操作
- 有两个表,关联字段是userid,每个用户下面有多条记录,怎么列出所有用户的最后一条记录!!!
- 领域建模有很多种方法,对于同样的问题域使用不同的建模手段得到的模型可能也不尽相同。于是我经常听到这样一个问题:怎么才能保证建模的正确性?
- 如何判断一条记录什么字段被修改了 [问题点数:40分,结帖人bluesukeke]
- 数据库 UPDATE多条记录不同值,同时UPDATE多个字段
- mongo 不同字段比较,根据比较结果进行修改
- Oracle多用户同时修改同一记录,怎样保证该客户记录
- sql中怎样把同一张表中相同字段的内容合并为一条记录(不同字段的那一列每个记录后面加逗号)
- 多个线程可能会试图同时访问某个对象。在多个线程同时争相访问某个对象的同时,如果一个线程修改了资源,有些线程可能会收到无效状态。例如,如果某个线程读取对象的字段,同时另一线程正在修改该字段,则第一个线程可能会收到无效的字段状态。这种情况称为竞用情况。
- EF异常‘在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。 请注意不保证 DbContext 的实例成员’
- 随机选取某个字段值不同的记录各一条
- 页面上有个添加按钮,程序运行成功的,当我添加一条记录后刷新页面,它自动又添加一条,这样怎么修改?
- 如果结合GridView和DetailsView对数据进行操作,那么当数据库的记录为空的时候,怎么来增加新记录呢?
- 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理
- 一条语句中查询数据库表中state字段为不同情况下的记录数
- SQL 同一张表中相同字段的内容合并为一条记录(不同字段的那一列每个记录后面加逗号)
- 有一条记录,其中有一个字段是图片路径,删除记录同时也要删除图片的执行顺序?
- SQL 查询表格中某字段不同值的最新一条记录