Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 悲观锁定记录?_C#_Mysql_Pessimistic Locking_Rowlocking - Fatal编程技术网

C# 悲观锁定记录?

C# 悲观锁定记录?,c#,mysql,pessimistic-locking,rowlocking,C#,Mysql,Pessimistic Locking,Rowlocking,我正在为Silverlight应用程序创建一个WCF Web服务,我需要有一个记录在修改时被读/写锁定 我使用的是MySQL版本5.5.11 更具体地说,我想防止请求在修改某行时从该行读取数据 UPDATE和SELECT的两个SQL命令实际上非常简单,类似于: 更新(应锁定写入/读取): 更新用户集用户=。。。。。其中id=。。。。。 选择(从上面的查询锁定时,应无法读取): SELECT*FROM user,其中id=。。。。。 以下是我尝试过的,但它似乎根本不起作用或锁定任何东西: 启动

我正在为Silverlight应用程序创建一个WCF Web服务,我需要有一个记录在修改时被读/写锁定

我使用的是MySQL版本5.5.11

更具体地说,我想防止请求在修改某行时从该行读取数据

UPDATE和SELECT的两个SQL命令实际上非常简单,类似于:

更新(应锁定写入/读取):

更新用户集用户=。。。。。其中id=。。。。。
选择(从上面的查询锁定时,应无法读取):

SELECT*FROM user,其中id=。。。。。
以下是我尝试过的,但它似乎根本不起作用或锁定任何东西:

启动事务;
选择用户
来自用户
其中id='用户id'
更新;
更新用户
SET user='用户数据'
其中id='用户id';
犯罪

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

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

判断是否存在问题的唯一方法是,如果在事务启动后运行了查询,但返回了用户的原始值,而不是更新后的值。发生了吗


我本想把它放在评论中,但它太长了,但我会根据您的回答更新为更完整的答案。

MySql使用多版本并发控制(这是一个非常非常好的行为,而不是MSSQL)。尝试使用(锁定共享模式)实现您想要的功能。

为什么要在事务中执行此操作<代码>更新自动运行。也就是说,你所尝试的应该仍然有效;是什么让你认为它不会呢?嗨,在我的原始帖子中,SQL查询是否也会阻止其他查询从此行读取数据?在我的例子中,似乎发生了这样的情况:当一条记录正在被修改时,另一条记录能够从中读取数据和/或返回旧值。这是一个web应用程序,不知道它是否重要。您的事务将持续一小部分秒。一开始,另一个查询能够在这么短的时间内启动的可能性非常小。可能是在更新事务开始之前开始的返回旧值的查询。听起来你还没有证实这确实是个问题,我怀疑你的问题出在其他地方。@Armz另外,我不使用mysql,所以我不是mysql如何锁定的专家,但我想你可能误解了什么时候需要使用mysql进行更新。如果只更新一个表,那么应该锁定行,而不需要自己锁定它们。例如,当您需要确保在释放表上的锁之前执行多个任务时,就会出现问题。要在多个update语句之间保持行锁定,您可以使用update在整个时间内保持它们锁定。但对于单个update语句来说,我认为这是多余和不必要的。