悲观地锁定记录
本文关键字:记录 锁定 悲观 | 更新日期: 2023-09-27 18:36:22
我正在为 Silverlight 应用程序创建一个 WCF Web 服务,我需要有一个记录在修改时被读/写锁定。
我正在使用MySQL版本5.5.11。
更具体地说,我想防止请求在修改时从 Row 读取数据。
UPDATE 和 SELECT 的两个 SQL 命令实际上非常简单,如下所示:
更新(应锁定以进行写入/读取):
UPDATE user SET user = ..... WHERE id = .....
选择(从上面的查询锁定时应该无法读取):
SELECT * FROM user WHERE id = .....
这是我尝试过的,但它似乎不起作用或根本没有锁定任何东西:
START TRANSACTION;
SELECT user
FROM user
WHERE id = 'the user id'
FOR UPDATE;
UPDATE user
SET user = 'the user data'
WHERE id = 'the user id';
COMMIT;
您如何确定它没有锁定记录?
当查询在带有锁的表上运行时,它将等待锁被释放或最终超时。 您的更新事务发生得如此之快,以至于您甚至无法分辨出它已被锁定。
您能够判断存在问题的唯一方法是,如果您的查询在事务开始后运行,但返回了用户的原始值而不是更新的值。 有没有发生过这种情况?
我本来会把它放在评论中,但它太长了,但我会根据您的回复用更完整的答案更新它。
MySql 默认使用多版本并发控制(这是一个非常非常好的行为,而不是 MSSQL)。尝试使用锁定读取(共享模式下锁定)来实现您想要的。