【发布时间】:2015-09-12 02:19:00
【问题描述】:
我有一个classic ASP 页面,想将transaction isolation level 设置为READ UNCOMMITTED。使用this documentation 我想出了以下内容:
Set conn = GetConnection
conn.IsolationLevel = adXactReadUncommitted
'conn.BeginTrans
'conn.CommitTrans
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = "INSERT INTO [dbo].[A] ([IsolationLevel]) SELECT CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL FROM sys.dm_exec_sessions where session_id = @@SPID"
Set rs = cmd.Execute()
response.write(conn.IsolationLevel)
最后一个response.write 给了我正确的256 (READ UNCOMMITTED) 但是当我查询表时我只得到ReadCommitted 记录。
谁能告诉我做错了什么?
这是GetConnection 函数的主体:
FUNCTION GetConnection()
DIM strConnectionDotNet : strConnectionDotNet = "Data Source=..."
SET GetConnection = Server.CreateObject("adodb.connection")
GetConnection.connectionstring="Provider=sqloledb;" & strConnectionDotNet
GetConnection.open
END FUNCTION
【问题讨论】:
-
为什么不将所有的 sql 移动到存储过程中呢?这将使这种事情变得简单得多。我有一个更大的问题是你为什么要使用从经典 asp 中读取未提交的内容?这通常适用于 OLTP 系统,并且这种级别的隔离通常不是一个好主意,因为它可以并且将返回丢失和/或重复的行。
-
我无法轻松地将代码包装在
SQL object中,因为t-sql语句是在classic asp页面中动态构建的。对于显示此类数据(重复行、幻读等)的给定查询,可以。 -
当您开始在代码中构建 sql 语句时,这是一个非常滑的斜坡。这让我不寒而栗。您可以通过向查询中的每个表添加 nolock 提示来实现相同的目的。我经常看到人们想要使用 uncommitted,然后在随机时间结果不准确时感到困惑。
-
语句很复杂。我需要在许多功能中多次添加
WITH (NOLOCK)。这是遗留代码 - 我不喜欢它,但我现在需要处理它。不要担心未提交的数据 - 在这个业务案例中,使用此隔离级别非常有意义。
标签: sql-server tsql asp-classic isolation-level