0

我正在为 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;
4

2 回答 2

0

MySql默认使用多版本并发控制(这是一个非常非常好的行为,而不是 MSSQL)。尝试使用锁定读取(LOCK IN SHARE MODE)来实现您想要的。

于 2012-06-06T18:25:08.473 回答
0

您如何确定它没有锁定记录?

当对带有锁的表运行查询时,它将等待锁被释放或最终超时。您的更新事务会发生得如此之快,以至于您甚至无法判断它已被锁定。

您能够判断存在问题的唯一方法是,如果您有一个在事务开始后运行的查询,但返回的是用户的原始值而不是更新后的值。有没有发生过?

我本来只是把它放在评论中,但它太长了,但我会根据你的回复用更完整的答案更新它。

于 2012-06-06T18:00:16.777 回答