【发布时间】:2012-07-30 14:07:51
【问题描述】:
我对如何以非常具体的行为实现悲观锁定很感兴趣。 (我用 Sybase+Oracle+MSSQL 标记问题的原因是因为我很高兴有一个解决方案或“这是不可能的!”对于其中任何一个)
我想要的是: 1 - 能够锁定一行(以便该进程稍后可以进行更新,但没有其他进程可以锁定该行) 2 - 当另一个进程尝试锁定同一行时,它应该收到记录被锁定的通知 - 我不希望这个进程挂起(我相信可以在这里使用简单的超时) 3 - 当另一个进程尝试读取记录时,它应该能够以当前在数据库中的方式读取它(但我不想使用脏读)。
目前,应用程序使用共享内存解决了上述 3 个要求 - 并在数据库外部执行记录锁定。我想将锁定移动到数据库中。
到目前为止,我在 #1 和 #3 之间存在冲突 - 如果我通过将字段更新为相同值来执行“更新 ...”来锁定记录,那么来自另一个进程的“选择”会挂起。
编辑: 我现在对 MSSQL 上的快照隔离级别有一些运气。我可以在不使用脏读的情况下同时进行锁定和读取。
我不想使用脏读的原因是,如果报表正在运行,它可能会读取多个表并发出多个查询。快照为我提供了数据库的一致快照。如果是脏读,我会得到不匹配的数据——如果中间有任何更新的话。
我认为 Oracle 也有快照,所以现在我对 Sybase 最感兴趣。
【问题讨论】:
-
你能详细解释一下为什么你不想使用脏读吗?这就是您在 #3 中要求的定义。
标签: sql-server oracle sap-ase