【发布时间】:2013-06-02 16:24:39
【问题描述】:
假设我在数据库服务器上有一个表(我们称之为myTable),我正在编写一个桌面客户端应用程序,允许您修改myTable 中的记录。我不希望两个用户能够编辑同一条记录,即,如果用户 A 编辑记录 1 并且用户 B 尝试执行相同操作,他会收到通知,该记录当前已被用户 A“锁定”。
我确定这是一个常见问题,所以我想知道是否有规范的解决方案。
有一个明显的解决方案,但它也有一个明显的缺点:
-
在
myTable中添加字段inUseBy,当用户开始编辑记录时将其设置为用户名,并在用户完成后将其清除,例如function editRecord(recordId): begin transaction if (select lockedBy from myTable where id = recordId) is not empty: commit show "Sorry, record already in use by ..." else update myTable set lockedBy = current_user() where id = recordId commit show UI window to let user edit and update record update myTable set lockedBy = empty where id = recordId缺点:如果用户 A 的应用程序崩溃,记录将保持锁定状态。
以下方法乍一看似乎合适,但不能解决问题:
- 使用数据库锁来锁定记录 1。这只会导致用户 B 超时。我需要将记录锁定在应用程序级别而不是数据库级别。
【问题讨论】:
-
看起来你在谈论一种悲观的并发模式。也看看乐观并发 - stackoverflow.com/questions/659489/…
标签: sql-server database language-agnostic locking