2015-06-25 3 views
2

У меня есть страница classic ASP и вы хотите установить transaction isolation level в READ UNCOMMITTED. Использование this documentation я придумал следующее:Как установить уровень изоляции транзакций с помощью классического ASP?

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 
+0

Почему бы не переместить все ваши данные на хранимые процедуры? Это сделало бы это намного проще. Чем больше у меня вопрос, почему вы пытаетесь использовать read uncommitted из классического asp? Это, как правило, для OLTP-системы, и этот уровень изоляции, как правило, является плохой идеей для этого, поскольку он может и будет возвращать отсутствующие и/или повторяющиеся строки. –

+0

Я не могу легко скомпоновать код в 'SQL object', так как оператор' t-sql' динамически строит страницы 'classic asp'. Для данного запроса для отображения таких данных (дублированные строки, фантомные чтения и т. Д.) Это нормально. – gotqn

+0

Это очень скользкий наклон, когда вы начинаете создавать SQL-выражения в коде. Это заставляет меня дрожать. Вы можете добиться того же, добавив подсказку nolock в каждую таблицу в своем запросе. Слишком часто я вижу, что люди хотят использовать uncommitted, а затем путают, когда результаты неточны в произвольное время. –

ответ

2

Как сказано в документации:

Примечание: Настройки IsolationLevel не будет работать до следующего раза Вызывается BeginTrans.

Это своего рода странно, но мне нужно следующее:

conn.BeginTrans 
... sql statement is executed here 
conn.CommitTrans 

Даже думал, что T-SQL утверждение является SELECT. Кроме того, после conn.CommitTrans он по-прежнему использует уровень изоляции по умолчанию (тот, который указан в контексте базы данных).

Смежные вопросы