如何有效地锁定/阻止行?

时间:2019-07-08 18:14:20

标签: mysql

我正在使用api为公司开发库存系统。我希望能够允许第一个人从mysql数据库中选择一个行来拥有锁。应该拒绝第二个人使用第一位用户拥有的行集合中的任何数据。那有可能吗?

用例,数据库中的信息由用户不断添加或更新。如果用户A进行了选择,则始终会进行更新。但是,如果用户B选择了在用户A完成之前对其进行更新的信息,则当用户A完成后,来自用户B的所有工作都将丢失,反之亦然。

我尝试使用事务,但是这并没有阻止第二个用户获得第一个用户请求的行。

start transaction;
select * from peak2_0.staff where 'First Name'='Aj';

update peak2_0.staff set `First Name` = 'aj' where 'First Name'='Aj';
commit;

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,您可以创建一个(或两个)字段来在用户处理条目时“锁定”该条目。比实际的服务器锁定更像是“停机维护”指示符。您甚至可以使用以下方法使其变得原子且可恢复:

UPDATE someTable 
SET locked_by = client_or_user_id, locked_when = now() 
WHERE [criteria for selected the record(s) being worked on] 
AND locked_by IS NULL
;

然后,您可以从表中进行选择,以查看该锁是否具有您的程序客户端ID或用户ID。从某种意义上说,“可恢复”是指,如果客户端系统在解锁数据之前停机,则例行过程(客户端或MySql事件)可以释放任何早于一定时间的锁。另外,原始更新以及任何尝试遵守锁的操作都可以将标准锁检查条件调整为AND (locked_by IS NULL OR locked_when < now() - INTERVAL 15 MINUTE)

如果编辑客户端需要更长的锁定时间,只需进一步更新locked_when值即可;或者您也可以/也可以使用“锁定至”字段。

(可选)您甚至可以添加锁定原因,以便尝试访问此类条目的客户端可以获知为何该条目不可用。