Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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 Server表以进行写入,但不用于读取_C#_.net_Sql_Sql Server - Fatal编程技术网

C# 锁定SQL Server表以进行写入,但不用于读取

C# 锁定SQL Server表以进行写入,但不用于读取,c#,.net,sql,sql-server,C#,.net,Sql,Sql Server,建议的副本无法回答标题中的问题。 我想锁定一个表,以便它不能写入,但可以读取。可能吗 这就是使用IsolationLevel.Serializable的事务中发生的情况吗?或者,这仅适用于受影响的行?(这也是read上的锁吗?) 如果有关系的话:我用C#来做这件事。不,这是不可能的 只有持有锁的会话才能访问表。在释放锁之前,其他会话无法访问它 请参阅以下链接: 您可能需要查找NOLOCK/READUNCOMMITED选项: 它将允许您从当前锁定的表中读取数据,但请注意其含义:您可能最终读取“重影

建议的副本无法回答标题中的问题。

我想锁定一个表,以便它不能写入,但可以读取。可能吗

这就是使用
IsolationLevel.Serializable
的事务中发生的情况吗?或者,这仅适用于受影响的行?(这也是read上的锁吗?)

如果有关系的话:我用C#来做这件事。

不,这是不可能的

只有持有锁的会话才能访问表。在释放锁之前,其他会话无法访问它

请参阅以下链接:


您可能需要查找NOLOCK/READUNCOMMITED选项:


它将允许您从当前锁定的表中读取数据,但请注意其含义:您可能最终读取“重影”数据,即在事务中插入然后回滚的数据。

您应该在表上创建唯一约束。即使您通过第一个进程锁定了表,另一个进程也很可能只会在第一个进程存在之前被阻塞

然后,您可能开始摆弄超时,以确保第二个进程在访问表之前超时,并且您正在向痛苦的世界敞开大门


到目前为止,覆盖构成重复项的任何字段的唯一约束是您的最佳选择,并将确保不输入重复项,据我所知,这是您的最终目标。

我认为您可能希望重新提交未提交,但我不确定使用“读取未提交”时一定要非常小心。它不会取出共享锁。在他的情况下,这可能是正确的使用方法,但他必须注意脏读。@AndyNichols同意这意味着你可能会得到从未提交的返回数据。主要问题是:为什么!?!?你想达到什么目标?你可以拒绝每个人的插入、更新和删除权限,但是这个表有什么好处呢?@ispiro建议的副本回答了你评论中所说的实际任务是你想要做的,所以它通过不同于你的标题所建议的机制来做这件事的事实并不真正相关。这个链接是针对mysql的。他想要MSSQL。因此,一个更合适的链接是您的链接与MySql服务器有关。很抱歉,我将使用适当的链接进行编辑。我假设您指的是
IsolationLevel。Serializable
-该链接表示表未被锁定。相反,只有某些行被锁定。那不是我要找的。我说得对吗?-1这不是真的。可以取出表级别
S
锁。所以您说的唯一方法是真正锁定表,然后重新提交(与选择性锁相反)?@ispiro如果表被锁定,那么您将无法有效地写入它,但您可以使用ReadUncommitted从中读取。不过,你到底想达到什么目的?您是否有意锁定桌子,如果是,原因是什么,锁定时间是多长?可能还有其他方法可以研究。我想防止两个相同的行被不同的“编写器”编写。每个“writer”都会检查它想要写入的行是否不存在(在写入之前)-但是如果同时检查,然后同时写入-我会得到两个相同的行。@ispiro为什么不在表上创建一个唯一的约束?然后,数据库将拒绝潜在的副本。