我有一个程序连接到Oracle数据库并对其执行操作.我现在想要调整该程序以支持SQL Server数据库.
在Oracle版本中,我使用"SELECT FOR UPDATE WAIT"来锁定我需要的特定行.我在更新基于SELECT的结果的情况下使用它,而其他会话绝对不能同时修改它,所以他们必须先手动锁定它.系统很可能会同时尝试访问相同的数据.
例如:
两个用户尝试获取具有最高优先级的数据库中的行,将其标记为忙,对其执行操作,并将其标记为可用以供以后使用.在Oracle中,逻辑基本上会像这样:
BEGIN TRANSACTION;
SELECT ITEM_ID FROM TABLE_ITEM WHERE ITEM_PRIORITY > 10 AND ITEM_CATEGORY = 'CT1'
ITEM_STATUS = 'available' AND ROWNUM = 1 FOR UPDATE WAIT 5;
UPDATE [locked item_id] SET ITEM_STATUS = 'unavailable';
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
请注意,查询是在我的代码中动态构建的.另请注意,当先前最有利的行被标记为不可用时,第二个用户将自动转到下一个,依此类推.此外,处理不同类别的不同用户不必等待彼此的锁被释放.最糟糕的是,5秒后,将返回错误并取消操作.
最后,问题是:如何在SQL Server中实现相同的结果?我一直在寻找锁定提示,理论上看起来它们应该起作用.但是,唯一阻止其他锁的锁是"UPDLOCK"和"XLOCK",它们只能在表级工作.
那些在行级别工作的锁定提示都是共享锁,它们也不能满足我的需求(两个用户可以同时锁定同一行,都将其标记为不可用并对相应的项执行冗余操作).
有些人似乎添加了一个"时间修改"列,因此会话可以验证他们是修改它的人,但这听起来会有很多冗余和不必要的访问.
我有一个Sudoku求解算法,我的目标是尽可能快地制作.为了测试这个算法,我多次运行它并计算平均值.在注意到一些奇怪的数字后,我决定打印所有时间并得到这个结果:
Execution Time : 4.257746 ms (#1)
Execution Time : 7.610686 ms (#2)
Execution Time : 6.277609 ms (#3)
Execution Time : 7.595707 ms (#4)
Execution Time : 7.610131 ms (#5)
Execution Time : 5.011104 ms (#6)
Execution Time : 3.970937 ms (#7)
Execution Time : 3.923783 ms (#8)
Execution Time : 4.070238 ms (#9)
Execution Time : 4.765347 ms (#10)
Execution Time : 0.818264 ms (#11)
Execution Time : 0.620216 ms (#12)
Execution Time : 0.679021 ms (#13)
Execution …
Run Code Online (Sandbox Code Playgroud) 我正在使用VC++中的应用程序,其中使用网络驱动器来访问文件.用户手动分配驱动器,然后在应用程序中选择驱动器.这导致驱动器不总是映射到相同的服务器.
我如何获得这样一个文件的UNC路径?这主要用于识别目的.
我有一些代码连接到Oracle数据库,锁定表,做一些事情并解锁它.
我想知道,如果我的程序在表被锁定时冻结,则锁会自动释放.
有没有办法设置Oracle,自动执行此操作?
例如,我正在考虑一些事情会说"如果用户x在表y上保持锁定超过z秒,则回滚事务并释放表."
如果不可能,我还能做些什么来达到同样的效果吗?这甚至是一个实际问题还是我只是偏执狂?
提前致谢.
database ×2
locking ×2
oracle ×2
algorithm ×1
c++ ×1
concurrency ×1
directory ×1
java ×1
jit ×1
jvm ×1
mfc ×1
path ×1
performance ×1
session ×1
sql-server ×1
visual-c++ ×1