数据库锁与Redis锁配合同义互补,实现精准锁定(数据库锁和redis锁)
数据库锁与Redis锁是当前系统设计中最常用的锁定机制,它们被广泛用于多线程、多机器环境中,有效地隔离应用程序访问冲突。他们定义了不同的机制来防止多进程/线程同时操作同一资源,从而避免了竞争条件(race condition)。两者同义互补,可以共同实现精准的锁定。
数据库锁是利用事务的特性实现的,在数据库中,如果一个会话对一个表加锁,那么其他会话在该表上的操作就会失败,直到会话提交或回滚事务才能继续操作。比如MySQL就提供了SELECT… LOCK IN SHARE MODE和SELECT … FOR UPDATE语句用于数据库锁定,可以实现加读锁或写锁。它可以让同一时刻,仅有一个进程能够修改表数据,其余请求将会被阻塞排队,直到当前事务结束。如下:
SELECT * FROM orders WITH (UPDLOCK) WHERE id = 10 # 对 orders 表加写锁SELECT * FROM orders WITH (SHAREDLOCK) WHERE id = 10 # 对orders表加读锁