我正在使用 select sql(IBM i 上的 DB2)从数据库中读取记录并将其显示为用户可以修改和更新的表单!
现在我需要,如果用户正在查看此记录,同时另一个用户只能查看但不能更新同一个 racord!
我该怎么做?有没有一种方法可以选择此记录来分配(或阻止)记录以避免同时更新?(如果有相同的 php 指令来做)
(例如,我使用 RPG 语言程序,我使用分配记录的 CHAIN 指令来防止此问题)
谢谢!
我正在使用 select sql(IBM i 上的 DB2)从数据库中读取记录并将其显示为用户可以修改和更新的表单!
现在我需要,如果用户正在查看此记录,同时另一个用户只能查看但不能更新同一个 racord!
我该怎么做?有没有一种方法可以选择此记录来分配(或阻止)记录以避免同时更新?(如果有相同的 php 指令来做)
(例如,我使用 RPG 语言程序,我使用分配记录的 CHAIN 指令来防止此问题)
谢谢!
根据我的经验,如果可能的话,你需要避免走这条路。
是的,可以锁定记录,但是您打算保持锁定多长时间?如果您的锁定用户在点击“保存”之前吃了很长时间的午餐会发生什么?
面对您遇到的问题,我会考虑在更新之前对记录进行读取检查。如果您发现它已被其他用户更改,您可以将其标记出来或使用某些逻辑来仅更改已修改的字段。
如果您控制对表的所有访问,例如绿屏应用程序,锁定行会很有用。如果您不控制所有访问,例如其他人有一个读取行的 Web 应用程序,或者一个 ODBC 应用程序读取行,他们可能会因无法获取所有行而感到沮丧。绝对要考虑表在访问它的所有应用程序中所起的更大作用。
也就是说,锁定行的 DB2 SQL 方法是 FETCH ... FOR UPDATE。
是的,您可以在更新数据时锁定表。我不知道您如何在 DB2 上做到这一点,但是您可以在更新数据时锁定表,并在完成后解锁它们。
愿此链接可以帮助您:
如何避免锁定记录读取?
Select * from yourtable
where field='comarator'
SKIP LOCKED DATA
您还可以检索特定数量的行
Select * from yourtable
where field='comarator'
SKIP LOCKED DATA
FETCH FIRST 1 ROWS ONLY
它适合你吗?