Запрос данных перед фиксацией транзакции


10

Насколько я понимаю, что в окне MS SQL Server Management Studio после выполнения «начала транзакции», а затем внесения некоторых изменений, таких как добавление данных в таблицу, вы можете запросить только эту таблицу и эти изменения из того же окна, пока не выполните «совершить транзакцию».

Есть ли способ сделать запрос из другого источника перед выполнением «транзакции фиксации»?

Конкретно для моей текущей цели и добавить некоторый контекст. Я делаю несколько запросов SQL из Excel Power Query. Мне бы очень хотелось иметь возможность выполнять эти запросы до «транзакции фиксации», чтобы я мог провести некоторый анализ и выяснить, следует ли выполнять откат вместо фиксации.

Ответы:


14

Да, это возможно, если вы измените уровень изоляции транзакции для сеанса (это то, что вы называете «окном» в SSMS), который запрашивает измененные данные. Часто это не очень хорошая идея, так как вы можете получить неожиданные результаты . Тщательно продумайте побочные эффекты. Я понятия не имею, возможно ли изменить уровень изоляции транзакций в Excel Power Query.

Например, следующий набор запросов вставит некоторые данные и отобразит обновление правильно даже без фиксации / отката.

-- Session 1
begin tran tx_test;
-- Assume the Test table exists and insert is okay
insert dbo.Test(datadate, content) values (getdate(), 'transaction');
select * from Test; -- Shows the new data
-- After select, one would execute one of the following
-- commit;
-- rollback;

Между тем, второй сеанс выполняет выборку, которая, похоже, ничего не делает:

-- Session 2
-- This waits for uncommitted transaction
-- and returns results after 1st session commits/rollbacks
select * from Test;

Создайте третий сеанс и измените его уровень изоляции:

-- Session 3
set transaction isolation level read uncommitted;
-- This reads the inserted data from the 1st session, even before commit
select * from Test;

Это все имеет смысл! Мне нужно попробовать, а затем пометить его как ответ. Спасибо.
Алекс

3

В соответствии с передовой практикой транзакции должны быть максимально короткими и никогда не ждать взаимодействия с пользователем ; каждый раз, когда вы выполняете какой-либо тип данных или модификацию схемы в транзакции, это накладывает блокировки на объекты или строки, к которым были произведены прикосновения / изменения, что заставляет запросы других пользователей ждать. В свою очередь, это может создать цепные эффекты, которые могут привести к остановке сервера базы данных.

В описываемом сценарии я бы порекомендовал вам сделать копию данных, чтобы разделить таблицы «что, если», где вы можете вносить изменения и просматривать результаты. Когда вы довольны результатами, используйте транзакцию, чтобы объединить данные этой таблицы обратно в исходные таблицы.


Похоже, хороший совет. Ответ @vonPryz был просто хочу, чтобы я нуждался в данный момент. Я думаю, что ваше предложение должно быть то, на что я смотрю дальше.
Алекс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.