【问题标题】:SET TRANSACTION isolation level READ uncommitted - is it necessary to explicitly use transaction begin and end?SET TRANSACTION 隔离级别 READ uncommitted - 是否有必要显式使用事务开始和结束?
【发布时间】:2016-07-26 23:57:57
【问题描述】:

下面的查询是否有效,或者我是否使用了明确的事务存在和结束?

是的,我知道读取未提交的危险

SET TRANSACTION isolation level READ uncommitted 

SELECT TOP 100 tblguilds.guild_id, 
               tblguilds.guildname, 
               tblguilds.leaderuserid, 
               tblusersprofile.username 
FROM   tblguilds 
       LEFT JOIN tblusersprofile 
              ON tblusersprofile.userid = tblguilds.leaderuserid 
WHERE  tblguilds.guild_id NOT IN (SELECT guildcode 
                                  FROM   tblguildapplied 
                                  WHERE  userid = 1) 
ORDER  BY Newid() 

【问题讨论】:

  • 我的理解是,围绕选择的事务开始/结束不做任何事情。选择与更新/插入一起做一些事情,但在开始/结束内选择 only 是没有意义的。也许有人可以证实这一点。

标签: sql-server tsql sql-server-2014 read-uncommitted


【解决方案1】:

是的,这将起作用,但请注意它将在整个会话期间生效。这意味着您在该选择之后执行的任何 SQL 都将使用该隔离级别。如果您想将其限制为 select stmt 中的某些表,请考虑使用 NOLOCK 提示

在这里查看更多: WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Begin 事务和提交(没有 END 事务)仅适用于插入/更新/删除

顺便说一句,我会修改该查询以使用左外连接而不是 NOT IN 来提高性能。

【讨论】:

  • 所以我们可以说每个连接 = 每个会话对吗?
  • @MonsterMMORPG 是的,但从技术上讲,在同一 SPID 中运行的所有内容都是准确的,在该 SPID 下执行了“设置隔离级别....”命令,它将一直有效直到该 SPID(连接)已关闭或隔离级别显式重置/更改为其他内容。
猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2021-03-20
相关资源
最近更新 更多