Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# 与SQL事务和行锁混淆ASP.net C_C#_Asp.net_Sql Server - Fatal编程技术网

C# 与SQL事务和行锁混淆ASP.net C

C# 与SQL事务和行锁混淆ASP.net C,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我已经面临这个问题很长时间了 我的表格上有两个按钮。btnNEXT,btnSUBMIT 当用户单击btnNEXT时,将显示下一条记录的详细信息。然后用户输入一些数据并单击btnSUBMIT。此操作将更新该特定记录的详细信息 现在,我有大约10个用户在使用它。当user1单击btnNEXT时,他将得到一条要修改的记录。现在我希望该记录被锁定,其他用户无法看到该记录。当User1输入详细信息并单击btnSUMBIT时,记录将被更新,锁将被释放 另一种情况: User1单击btnNEXT。然后记录将被

我已经面临这个问题很长时间了

我的表格上有两个按钮。btnNEXT,btnSUBMIT

当用户单击btnNEXT时,将显示下一条记录的详细信息。然后用户输入一些数据并单击btnSUBMIT。此操作将更新该特定记录的详细信息

现在,我有大约10个用户在使用它。当user1单击btnNEXT时,他将得到一条要修改的记录。现在我希望该记录被锁定,其他用户无法看到该记录。当User1输入详细信息并单击btnSUMBIT时,记录将被更新,锁将被释放

另一种情况: User1单击btnNEXT。然后记录将被锁定。如果用户在未更新任何数据的情况下关闭了应用程序,则应解锁记录

我所做的: 开始传输使用updlock从表中选择top 1*,读取超过where条件

更新表集a=1,b=2,其中id=123提交传输

以上查询满足我锁定和解锁行的条件。但我想在btnNEXT_Click事件中开始事务,并在btnSUMBIT_Click事件中提交事务

我怎样才能做到这一点?。。我无法超越这一点思考。请告诉我,如果你有任何选择,可以满足我的整个方案


非常感谢

这是无状态应用程序固有的问题。如果用户放弃会话,只需离开或关闭浏览器,您就无法确定会话是否应该关闭。我提出的最佳解决方案是使用时间戳作为锁定字段,然后定期轮询锁定时间过长的记录。这不是一个完美的解决方案,但它应该解决您90%以上的问题

在OP的评论之后编辑:

@在ARB中,事务用于执行可能需要回滚的SQL语句序列。它通常用于保存操作、插入、更新和删除。您不能回滚select语句—没有要“撤消”的内容。因此,不需要在事务中包装btnNext操作和btnSubmit操作。此外,当我使用事务时,它是以单个命令序列的形式出现的。我不能说我知道你不能参加中间交易,但我从来没看到过。根据btnSubmit之后的save函数的复杂性,可能是使用事务的好地方,但仅当您要保存到多个表时

总之:

由于web应用程序的无状态性质,以及无法“强制”用户“正常”关闭会话,因此您需要一种机制来“解锁”已锁定“太长”的记录


由于btnNext操作中没有要“回滚”的内容,因此select命令没有理由将其包含在事务中。如果您希望隔离BTNSUPMIT保存操作,那么这可能很有用

你好,谢谢你的回复。但是,如何在btnNEXT\u Click事件中开始事务并在btnSUBMIT\u Click事件中提交。。请给我一些样本代码,如果你有你可以使用乐观锁定?请参阅:。如果您仍然真的想使用悲观锁定,您可以使用类似于专用锁定表的功能,但是您需要某种方式,以便在事务未完成时能够解锁项目。在SQL server中不确定地持有锁定会导致灾难。。。正如@moe所说,锁定表可能是一个不错的解决方案