Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ППЛ помогите разобраться с уровнями изоляции / 6 сообщений из 6, страница 1 из 1
14.05.2001, 12:30
    #32005586
ППЛ помогите разобраться с уровнями изоляции
Привет всем !

1. если выполнить SET TRANSACTION ISOLATION LEVEL ..., то это будет опеределено ТОЛЬКО для трансакции в которой было это выполнено или для всего сервера
2. если идет конструкция
BEGIN TRANSACTION
.....
__BEGIN TRANSACTION
__ ....
__COMMIT TRANSACTION
COMMIT TRANSACTION
уровень изолированности наследуется или нет
3. будет ли работать след конструкция
BEGIN TRANSACTION T1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.....
__BEGIN TRANSACTION T2
__SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
__ ....
__COMMIT TRANSACTION
COMMIT TRANSACTION
и что будет если я откачу ( rollback ) транзакцию с именем T1 ??

Спасибо
з.ы. подскажите URL, где можно об этом почитать на русском.
...
Рейтинг: 0 / 0
14.05.2001, 13:02
    #32005588
ППЛ помогите разобраться с уровнями изоляции
Как-то по понедельникам, идеи странно кучкуются

4.
BEGIN TRANSACTION trnsT1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
(1)изменение необходимых данных
SAVE TRANSACTION trnsChangeDataT1

__EXEC @Return = spTransferData

__IF ( @Return = 1 )
____ROLLBACK TRANSACTION trnsChangeDataT1
__ELSE
____COMMIT TRANSACTION trnsT1

Есть такая конструкция ( может в чемто не корректно, это идея )
Вопрос
1. увижу ли я изменения в spTransferData произведенные на этапе (1) ?
2. если я произведу изменение данных в spTransferData, откатятся ли он при ROLLBACK TRANSACTION trnsChangeDataT1, при условии, что внутри spTransferData выполняется BEGIN TRANSACTION ?

5. Нашел в BOL
BEGIN TRANSACTION royaltychange
UPDATE titleauthor SET royaltyper = 65 FROM titleauthor, titles
WHERE royaltyper = 75 AND titleauthor.title_id = titles.title_id AND title = 'The Gourmet ave'
UPDATE titleauthor SET royaltyper = 35 FROM titleauthor, titles
WHERE royaltyper = 25 AND titleauthor.title_id = titles.title_id AND title = 'The Gourmet '

SAVE TRANSACTION percentchanged

UPDATE titles SET price = price * 1.1 WHERE title = 'The Gourmet Microwave'

ROLLBACK TRANSACTION percentchanged
COMMIT TRANSACTION

COMMIT TRANSACTION какую транзакцию он прекращает ??
...
Рейтинг: 0 / 0
14.05.2001, 16:30
    #32005609
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ППЛ помогите разобраться с уровнями изоляции
1. SET TRANSACTION ISOLATION LEVEL устанавливается только для текущего коннекта.

2. Нет такого понятия - наследование isolation level. Есть, условно говоря, некий флажок, глобальный для данного коннекта - какой уровень изоляции. Каким он последний раз был установлен, таким он и будет, пока ты его явно не изменишь.

3. Установление isolation level никак не влияет на начало/окончание транзакции - это независимые понятия. Кстати, если уж ты хочешь использовать именованные транзакции, то лучше commit и rollback делать тоже именованными - иначе в конце концов это может привести к конкретному геморрою - код будет нечитабельным, потому что безымянные commit/rollback относятся к текущей транзакции. Если ты откатишь T1, то откатываются и все внутренние транзакции, даже если для них был сделан commit - полная вложенность. Избегай пересечения - конструкции типа
begin tran tran1
begin tran tran 2
commit/rollback tran tran 1
commit/rollback tran tran 2
приведут к полной фигне в части случаев. Полностью вложенные друг в друга транзакции - это нормально и естественно.

4.1 Изменения увидишь даже без SET TRANSACTION ISOLATION LEVEL. Потому что его установка нужна для того, чтобы видеть изменения, делающиеся в ДРУГОМ коннекте, а ты находишься в том же самом.

4.2 Изменения откатятся, потому что транзакция внутри spTransferData является вложенной по отношению к trnsChangeDataT1.

5. Безымянный commit/rollback относится к текущей транзакции. В приведенном тобой примере есть только 1 транзакция. Save - это не открытие новой транзакции, это запоминание некоей точки, к которой можно потом вернуться. Поэтому в конце приведенного кода должен получиться следующий результат - первые 2 update'а сохранились, а 3-й (тот который попал под rollback) откачен.
...
Рейтинг: 0 / 0
14.05.2001, 17:13
    #32005622
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ППЛ помогите разобраться с уровнями изоляции
А вложенные транзакции вообще существуют? Я всегда считал что нет. То есть написать то красиво можно, но при откате вложенности всё равно нет.

Допустим есть такой код:

create table t(i int)
insert t select 1
go

begin tran t1
update t set i=2
begin tran t2
update t set i=3
commit tran t2
commit tran t1

Куда и как мне надо вставить rollback tran t2, что бы в таблице осталось значение 2? Save tran - это не то, тогда можно и без вложенных транзакций.

Заранее благодарен
...
Рейтинг: 0 / 0
14.05.2001, 17:42
    #32005628
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ППЛ помогите разобраться с уровнями изоляции
Да, не совсем верно у меня написано. Вообще наиболее точное описание как всегда в BOL. Topic - nested transactions.

Итак, поправки насчет rollback'а. Он действует на самую внешнюю транзакцию, даже если явно указать имя внутренней транзакции. Так что
begin tran tran1
begin tran tran2
rollback tran tran2
commit tran tran1
не сработает. После rollback @@rowcount = 0.

А вот commit действует на самую внутреннюю транзакцию.
...
Рейтинг: 0 / 0
14.05.2001, 18:14
    #32005635
ППЛ помогите разобраться с уровнями изоляции
GreenSunrise огромное спасибо.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ППЛ помогите разобраться с уровнями изоляции / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]