没听说有列锁的机制,主流的方式就是行锁。。我觉得你这种需求可以归到“热点行”优化上来,秒杀场景下的库存扣减就是最典型的“热点行”事务,有两个优化方法:名列前茅数据库可以将可能冲突的plan放在同一个线程排队。
一、如果同一条记录同时多个进程可能对不同的字段进行修改,怎么保证列锁
没听说有列锁的机制,主流的方式就是行锁。
我觉得你这种需求可以归到“热点行”优化上来,秒杀场景下的库存扣减就是最典型的“热点行”事务,有两个优化方法:名列前茅数据库可以将可能冲突的plan放在同一个线程排队,减少锁冲突引起的唤醒和忙等代价;另外就是可以使用“early lock release”的方式,在事务确定可以提交的情况下,不等待刷redolog而提前释放行锁,使得修改同一行的多个事务,有可能在一次group commit内提交,当然前提是这是一条auto commit的事务,而非交互型事务。当时做Oceanbase0.4版本时已经实现了这两个优化。
当我们尝试加细锁的粒度时,一定是当前的粒度无法充分应对竞态的频繁发生。字段锁可以缓解的是”多个事务修改某一记录的不同字段引起的阻塞”,而不是相同字段上的阻塞。这个时候建议题主反过来想一想,解决这个问题,一定要用字段锁吗?分表就可以了。每一次加细锁的粒度都是对数据库存储引擎设计的挑战。一方面它极大提高了系统的复杂度,另一方面,维护细粒度锁产生的内存对象也极大地增加了系统的overhead。从表锁,页锁向行锁跨越的历史可以明确地证实这一点。
延伸阅读:
二、数据库和 SQL 概念
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它的产生距今已有六十多年。随着信息技术和市场的发展,数据库变得无处不在:它在电子商务、银行系统等众多领域都被广泛使用,且成为其系统的重要组成部分。
数据库用于记录数据,使用数据库记录数据可以表现出各种数据间的联系,也可以很方便地对所记录的数据进行增、删、改、查等操作。
结构化查询语言(Structured Query Language)简称 SQL,是上世纪 70 年代由 IBM 公司开发,用于对数据库进行操作的语言。更详细地说,SQL 是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。