【问题标题】:In SQL Server 2005, is it possible to set transaction isolation level on a per-user basis?在 SQL Server 2005 中,是否可以按用户设置事务隔离级别?
【发布时间】:2025-12-03 07:55:02
【问题描述】:

在 SQL Server 2005 中,是否可以自动将事务隔离级别设置为,例如,读取未提交的每个用户?

(例如,如果我为用户 Fred 设置了这样的登录选项,Fred 就不必记得在他的 select 语句中添加 NOLOCK 提示,或者记得在他的 sql 中添加一个设置的事务隔离级别语句。)

【问题讨论】:

  • 用户将如何连接?如果我正确理解了您的问题,那么我认为没有任何方法可以做到。如果所有用户都通过一组代码进行连接,那么可能,但如果您希望它发生在 SSMS 中的即席查询等情况下,那么就不会。
  • 无论用户如何连接,我都在考虑设置它(因此该设置必须在 SQL Server 本身中)。

标签: sql-server sql-server-2005 tsql


【解决方案1】:

如果是存储过程,你可以在过程中有这样的代码

if user_name() in('dbo','username','otherusers','bla') 
set transaction isolation level read uncommitted
else
set transaction isolation level read committed

当然现在你有一个维护问题,所有当前的 procs 都必须修改

您也可以使用 suser_sname() 进行检查,但这真的会变成一个大 PITA

您也可以使用 LOGON Trigger 我没有尝试过,不确定它是否会起作用

【讨论】:

  • 我会调查触发选项。不完全是我所希望的,但它可能会奏效——谢谢!
  • Ewen - 触发选项好运吗?我正在尝试做与您完全相同的事情,听起来像。我有很多只读活动,并希望确保它们没有锁定表。
  • @Tom 抱歉,这晚了 2 年多,但不,触发选项不起作用。当然你可以在触发器中说SET ISOLATION LEVEL,但就像它在存储过程中工作一样,当触发器超出范围时它会恢复为默认值 - 所以它只对在登录触发器本身内部运行的查询有用。有a more recent discussion about this here
最近更新 更多