Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
如何仅选择已提交的行-sql2008_Sql_Sql Server 2008_Transactions - Fatal编程技术网

如何仅选择已提交的行-sql2008

如何仅选择已提交的行-sql2008,sql,sql-server-2008,transactions,Sql,Sql Server 2008,Transactions,如果表中的行不是任何尚未提交的事务的一部分,如何选择表中的所有行 例如: 比方说 表T有10行 用户A正在使用一些查询执行事务: INSERT INTO T (...) SELECT ... FROM T // doing other queries 现在,棘手的部分来了: 如果在用户A插入行和提交事务之间的时间内,用户B正在使用表T上的select更新系统中的列表,该怎么办 我只希望SELECT用户B使用返回的10行(表中的所有行,以后不能回滚)。如果可能的话,我该怎么做 我尝试在事务上

如果表中的行不是任何尚未提交的事务的一部分,如何选择表中的所有行

例如: 比方说

表T有10行

用户A正在使用一些查询执行事务:

INSERT INTO T (...)
SELECT ...
FROM T

// doing other queries 
现在,棘手的部分来了:

如果在用户A插入行和提交事务之间的时间内,用户B正在使用表T上的select更新系统中的列表,该怎么办

我只希望SELECT用户B使用返回的10行(表中的所有行,以后不能回滚)。如果可能的话,我该怎么做

我尝试在事务上设置isolationlevel,并在查询中添加“WITH(NOLOCK)”“WITH(READUNCOMMITTED)”,但没有任何运气

查询要么返回所有11条记录,要么等待事务提交,这不是我需要的


任何提示都非常感谢。

实际上,
readuncommitted
nolock
是一样的。它们意味着您可以看到尚未提交的行


如果以默认隔离级别运行,
readcommitted
,则不会看到尚未提交的新行。默认情况下,这应该可以工作,但如果您想确定,请在您的选择前面加上
设置事务隔离级别read committed

实际上,
read uncommitted
nolock
是相同的。它们意味着您可以看到尚未提交的行

如果以默认隔离级别运行,
readcommitted
,则不会看到尚未提交的新行。默认情况下,这应该可以工作,但如果您想确定,请在选择前加上
设置事务隔离级别read committed

,您需要使用(默认)
read committed
隔离级别和
readpass
提示跳过未提交时锁定的行(而不是在等待释放锁时被阻塞)

但这取决于插入是否去掉了行锁。如果插入去掉了页锁,您将返回到被阻止状态。示例如下

连接1

IF OBJECT_ID('test_readpast') IS NULL
BEGIN
   CREATE TABLE test_readpast(i INT PRIMARY KEY CLUSTERED)
   INSERT INTO test_readpast VALUES (1)
END

BEGIN TRAN
      INSERT INTO test_readpast 
      WITH(ROWLOCK) 
      --WITH(PAGLOCK)
      VALUES (2)
   SELECT * FROM sys.dm_tran_locks WHERE request_session_id=@@SPID
   WAITFOR DELAY '00:01';
ROLLBACK
连接2

SELECT i
FROM test_readpast WITH (readpast)
您需要使用(默认)
readcommitted
隔离级别和
readpass
提示跳过未提交的锁定行(而不是在等待释放锁定时被阻止)

但这取决于插入是否去掉了行锁。如果插入去掉了页锁,您将返回到被阻止状态。示例如下

连接1

IF OBJECT_ID('test_readpast') IS NULL
BEGIN
   CREATE TABLE test_readpast(i INT PRIMARY KEY CLUSTERED)
   INSERT INTO test_readpast VALUES (1)
END

BEGIN TRAN
      INSERT INTO test_readpast 
      WITH(ROWLOCK) 
      --WITH(PAGLOCK)
      VALUES (2)
   SELECT * FROM sys.dm_tran_locks WHERE request_session_id=@@SPID
   WAITFOR DELAY '00:01';
ROLLBACK
连接2

SELECT i
FROM test_readpast WITH (readpast)
?

要么是我,要么是提前回答的三个人误解了你的问题,所以我给了你一个链接,你可以自己决定。


要么是我,要么是提前回答的三个人误解了你的问题,所以我给了你一个链接,你可以自己决定。

READPAST也会跳过与当前插入的行位于同一页面上的提交行?@Andomar-实际上不是“READPAST lock提示仅适用于以读取提交隔离状态运行的事务,并且将只读取过去的行级锁。仅适用于SELECT语句。”但我认为该操作仍可能被页面锁阻止。可能快照隔离更合适。当我包含在(READPAST)中时我终于得到了我要求的10行。如果没有它,并且只使用read committed,我的select查询永远不会返回。也许我测试错了。@马丁·史密斯:我认为快照可以解决这个问题,但快照会产生很大的影响(大量使用tempdb,在更新过程中可能出现异常)@radbyx我刚刚用(readpass)测试了
这对我来说也很好。我认为这可能依赖于插入操作仅取出行锁,尽管我需要做更多的测试。READPAST还将跳过与当前插入的行位于同一页面上的提交行?@Andomar-实际上没有”READPAST lock提示仅适用于以读取提交隔离状态运行的事务,并且将仅读取过去的行级锁。仅适用于SELECT语句。“但我认为该操作仍可能被页面锁阻止。可能快照隔离更合适。当我包含在(READPAST)中时”我终于得到了我要求的10行。如果没有它,并且只使用read committed,我的select查询永远不会返回。也许我测试错了。@马丁·史密斯:我认为快照可以解决这个问题,但快照会产生很大的影响(大量使用tempdb,在更新过程中可能出现异常)@radbyx我刚刚用(readpass)测试了
这对我来说也很好。我认为这可能依赖于插入操作,仅取出行锁,尽管我需要做更多的测试。我认为我的解释与你的类似。关于在等待另一个事务提交时不被阻止的部分似乎被遗漏了。我认为我的解释与你的类似关于在等待另一个事务提交时不被阻止的部分似乎已经错过了。