Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Привет. Вопрос по правильной практике проектирования DB.
У меня есть некоторое не понимание работы с транзакциями в БД.

1. Нужно ли писать все процедуры-функции, чтобы они явно открывать и явно закрывать транзакции ? Т.е. вот прямо все процедуры-функции БД.
Как я понимаю. Если явно не открыть транзакцию, то режим работы в процедурах-функциях будет "каждая новая строка - отдельная транзакция". Полагаю это плохо. Ведь если первая строка изменит данные, а вторая выбросит исключения - то изменения первой транзакции не будут изменены. Так ?

2. Какие функции могут не открывать транзакции ? Те, что только читают данные ? Или вот прямо все функции в БД должны явно работать с транзакциями.

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

4. Какие настройки БД влияют на транзакции. Кажется (могу ошибиться) есть настройка, отвечающая за поведение "новая строка-отдельная транзакция" на уровне бд.

5. Вложенные транзакции. Если каждая процедура явно открывает новую транзакцию, то она может оказатся вложенной по отношению к вызывающей процедуре. Это нужно как-то учитывать ?
Например. Если Функция1 вызывает Функцию2 и Функцию3. Если каждая функция открывает по новой транзакции. Если Функция2 успешно отрабатывается, а Функция откатывает свою транзакцию - то, что будет с результатами работы Функции2 ? Они откатятся - т.к. обрабатывались во вложенной, по отношению к Функции1, транзакции; а транзакция Функции1 откатится ввиду того, что откатилась Функция3. Так, или я ошибаюсь ?
31 мар 16, 13:13    [19000007]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
1. Нужно ли писать все процедуры-функции, чтобы они явно открывать и явно закрывать транзакции ? Т.е. вот прямо все процедуры-функции БД.
Как я понимаю. Если явно не открыть транзакцию, то режим работы в процедурах-функциях будет "каждая новая строка - отдельная транзакция". Полагаю это плохо. Ведь если первая строка изменит данные, а вторая выбросит исключения - то изменения первой транзакции не будут изменены. Так ?

По всей видимости ваше понятие транзакции отличается от общепринятого.
Транзакция - это совокупность действий, которые должны выполняться как одно действие.
Т.е. транзакция не имеет никакого отношения к процедурам и функциям.
31 мар 16, 13:17    [19000034]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory,

Тогда про что тут написано, и где это используется ?

https://msdn.microsoft.com/ru-ru/library/ms174377(v=sql.120).aspx

SQL Server работает в следующих режимах транзакций.
Автоматическое принятие транзакций - Каждая отдельная инструкция является транзакцией.
...
31 мар 16, 13:24    [19000090]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
_djХомяГ
Guest
Не путайте ф-ции с процедурами
1 Ф-ция только возвращает данные (в скалярном/табличном виде) и не может осуществлять DML операции над постоянными таблицами
2 Процедура не имеет таких ограничений - соответственно может явно вызывать транзакцию (теоретич может и неявно, дело вкуса )
31 мар 16, 13:24    [19000094]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
_djХомяГ,

ок ок.
Я и пытаюсь во всем разобраться. Задал кучу вопросов. Надеюсь кто-то ответит и у меня прояснится в голове :)
31 мар 16, 13:26    [19000103]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Тогда про что тут написано, и где это используется ?

тут написано про один из реализованных режимов работы MS SQL
Который называется "Автоматическое принятие транзакций " и в котором "Каждая отдельная инструкция является транзакцией."
И там тоже нигде не написано ни про процедуры ни про функции
31 мар 16, 13:27    [19000112]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Надеюсь кто-то ответит и у меня прояснится в голове :)

Просто не сравнивайте красное и солёное. И все прояснится.
31 мар 16, 13:30    [19000133]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory,

вы только еще больше тумана наводите.
31 мар 16, 13:30    [19000135]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Glory,

вы только еще больше тумана наводите.

Нет никакого тумана.
Вы просто выдумали связь транзакций с процедурами.
31 мар 16, 13:35    [19000159]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сервер всегда работает в каком то из режимов транзакций. Он не может работать без транзакций.

Вы можете только выбрать один из режимов. Тот, который вам подходит для решения вашей конкретной задачи.
31 мар 16, 13:44    [19000244]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory,

1. Транзакции где нужно открывать ? На клиентской стороне, или и на серверной в процедурах/функциях) ?

2. На 5ый мой вопросик можете ответить ? С ним мне пока, все же, не понятно.
31 мар 16, 13:47    [19000265]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53748
ProBiotek
1. Транзакции где нужно открывать ? На клиентской стороне, или и на серверной в процедурах/функциях) ?

Транзакции нужно открывать там, где требуется инициировать атомарный блок работы с данными. Если это нигде не требуется - их можно вообще не открывать никогда.
31 мар 16, 13:51    [19000297]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
ProBiotek
1. Транзакции где нужно открывать ?


там где вам нужно. т.е. там где это требует бизнес-логика. в бизнес-транзакцию может входить и одна команада и _несколько_ процедур
31 мар 16, 13:52    [19000298]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
1. Транзакции где нужно открывать ? На клиентской стороне, или и на серверной в процедурах/функциях) ?

Там, где это обозначено ТЗ. Для того, чтобы решать конкретную задачу.

ProBiotek
2. На 5ый мой вопросик можете ответить ? С ним мне пока, все же, не понятно.

В MSSQL нет вложенных транзакций. Есть вложенные команды BEGIN TRANSACTION.
31 мар 16, 13:52    [19000299]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Glory
В MSSQL нет вложенных транзакций. Есть вложенные команды BEGIN TRANSACTION.


Я правильно предположил их работу, описав в 5м пункте (про откат Функции2, из-за отката Функции3) ?
31 мар 16, 14:00    [19000379]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Я правильно предположил их работу, описав в 5м пункте (про откат Функции2, из-за отката Функции3) ?

Если "их" - это вложенных танзакций, то неправильно.
Потому что нет вложенных транзакций. Есть одна(единственное число) транзакция. И отменить одну транзакцию можно только один раз.
31 мар 16, 14:04    [19000401]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
_djХомяГ
Guest
Пункт 5
Nesting Transactions
Committing inner transactions is ignored by the SQL Server Database Engine. The transaction is either committed or rolled back based on the action taken at the end of the outermost transaction. If the outer transaction is committed, the inner nested transactions are also committed. If the outer transaction is rolled back, then all inner transactions are also rolled back, regardless of whether or not the inner transactions were individually committed.
31 мар 16, 14:06    [19000406]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
_djХомяГ
Guest
Пункт 4
SET XACT_ABORT

SET IMPLICIT_TRANSACTIONS
31 мар 16, 14:23    [19000508]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
ProBiotek,

Если Вы понимаете область применения транзакций, т.е. в каких случаях, и владеете синтаксисом, то ответы на все Ваши вопросы есть в справке по MS SQL server, без преувеличений.
31 мар 16, 14:29    [19000550]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
iljy
Member

Откуда:
Сообщений: 8711
ProBiotek,

1. Нет никакой связи транзакций с процедурами и функциями. Транзакция - это совокупность логически связанных операций. Процедура может содержать несколько транзакций, или не содержать ни одной.
2. Режим IMPLICIT_TRANSACTIONS слабо влияет на открытие транзакций (любая изменяющая данные команда открывает транзакцию). Он влияет на то, когда эти транзакции закрываются: сразу по завершении команды либо только по явной команде COMMIT.
3. Вложенные транзакции - это условность. Откатывается-подтверждается всегда самая внешняя транзакция, а вложенные BEGIN TRAN - COMMIT влияют только на счетчик открытых транзакций.
31 мар 16, 15:33    [19000860]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
iljy
3. Вложенные транзакции - это условность. Откатывается-подтверждается всегда самая внешняя транзакция, а вложенные BEGIN TRAN - COMMIT влияют только на счетчик открытых транзакций.


Я правильно понимаю, что если Функция1 открывает транзакцию и вызывает 2 другие функции - каждая из которых открывает транзакции. То если одна из подфункций откатит свою транзакцию, то откатятся все 3 транзакции ?
31 мар 16, 16:05    [19001017]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ProBiotek,

кончайте выдумывать, читайте доку. вам уже всё разжевали
31 мар 16, 16:06    [19001026]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ProBiotek
Я правильно понимаю, что если Функция1 открывает транзакцию и вызывает 2 другие функции - каждая из которых открывает транзакции. То если одна из подфункций откатит свою транзакцию, то откатятся все 3 транзакции ?

Для начала в функциях MSSQL вообще нельзя нчего сделать с транзакциями
И потом вам уже привели ссылку и цитату на официальную документацию. И там даже есть пример кода.
И еще - не будет никаких 3х транзакций, будет 1 транзакция. Она всегда одна.
31 мар 16, 16:08    [19001034]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
ProBiotek
iljy
3. Вложенные транзакции - это условность. Откатывается-подтверждается всегда самая внешняя транзакция, а вложенные BEGIN TRAN - COMMIT влияют только на счетчик открытых транзакций.


Я правильно понимаю, что если Функция1 открывает транзакцию и вызывает 2 другие функции - каждая из которых открывает транзакции. То если одна из подфункций откатит свою транзакцию, то откатятся все 3 транзакции ?


Вам еще рано заниматься транзакциями, Вы абсолютно не владеете предметной областью.
31 мар 16, 16:14    [19001053]     Ответить | Цитировать Сообщить модератору
 Re: Должна ли каждая процедура-функция явно открывать транзакцию ?  [new]
_djХомяГ
Guest
Committing inner transactions is ignored by the SQL Server Database Engine. The transaction is either committed or rolled back based on the action taken at the end of the outermost transaction. If the outer transaction is committed, the inner nested transactions are also committed. If the outer transaction is rolled back, then all inner transactions are also rolled back, regardless of whether or not the inner transactions were individually committed.

В переводчике гугл
Транзакция либо фиксируется, либо откатывается на основе действий, принятых в конце самой внешней транзакции. Если внешняя транзакция зафиксирована, внутренние вложенные транзакции также будут зафиксированы. Если внешняя транзакция откатывается, то все внутренние операции тоже откатываются, независимо от факта их фиксации.

То есть , как говорили выше, все рулится одной самой внешней транзакцией (внутренних нет)
31 мар 16, 16:21    [19001084]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить