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

Откуда: Смоленск
Сообщений: 787
Добрый всем день.

Не могли бы вы мне тут помочь в освоении такой важной темы как транзакция ? просто для того чтобы овладеть глубоко этим понятием нужно сталкиваться с ними в реальной многопользовательской программе , а у меня такой возможности нет.

Как известно транзакция задает последовательность инструкций языка Transact-SQL, применяемую для объединения в один пакет операций чтения и записи для того, чтобы система базы данных могла обеспечить согласованность данных. (откопипастил первое попавшееся определение)
сразу вопрос что подрумянивается под инструкциями ?

к примеру есть несколько инсертов.

insert
insert
insert


Вопрос: тут что будет являться транзакцией каждый такой insert или же весь блок с инсертами или что иное или же пример не подходит (тогда большая просьба дать свой пример) ?
26 июл 18, 11:53    [21603807]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
L_argo
Member

Откуда:
Сообщений: 1132
такой блок будет одной транзакцией:

begin tran
insert
insert
insert
commit tran
26 июл 18, 12:01    [21603843]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
andron81
Как известно транзакция задает последовательность инструкций языка Transact-SQL, применяемую для объединения в один пакет операций чтения и записи для того, чтобы система базы данных могла обеспечить согласованность данных. (откопипастил первое попавшееся определение)
сразу вопрос что подрумянивается под инструкциями ?
Под инструкцией подразумевается любая команда доступа к данным.

Транзакцию можно задатьь на блок инструкций, например, явно начав её командой begin tran, либо на каждую отдельную инструкцию, тогда она начнётся сама - инструкция без транзакции выполнена быть не может.

andron81
к примеру есть несколько инсертов.

insert
insert
insert


Вопрос: тут что будет являться транзакцией каждый такой insert или же весь блок с инсертами или что иное
Если этот блок выполнялся в общей транзакции, то весь блок, и даже инструкции потом (время и объём транзакции не ограничены), а если общий транзакции нет, и если не задан режим автоначала транзакции, то каждая инструкция будет выполняться в своей транзакции.
26 июл 18, 12:03    [21603852]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
L_argo
такой блок будет одной транзакцией:

begin tran
insert
insert
insert
commit tran
Или такой:
insert
insert
insert
26 июл 18, 12:04    [21603856]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
L_argo
такой блок будет одной транзакцией:

begin tran
insert
insert
insert
commit tran
Или такой:
insert
insert
insert

это 3 транзакции, а не 1
26 июл 18, 12:12    [21603897]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
L_argo,

спасибо за ответы :)
тогда следующий вопрос :

Свойство атомарности обеспечивает неделимость набора инструкций, который модифицирует данные в базе данных и является частью транзакции.
Это означает, что или выполняются все изменения данных в транзакции, или в случае любой ошибки осуществляется откат всех выполненных изменений.

если мне необходимо объединить несколько инсертов в транзакцию , а по свойству атомарности транзакция , либо выполняется , либо откатывается даже прошлые успешные действия в ней. то я организовываю исходя из определений транзакции и атомарности так :

declare @newname varchar (255)
declare @oldname varchar (255)

set @oldname='ИП Афанасьев'
set @newname='ИП Луч'

BEGIN TRANSACTION
update BOOK_PURCH1 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES2 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES3 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES4 set CONTRACTOR = @newname where CONTRACTOR = @oldname
IF @@ERROR = 0
begin
COMMIT
SELECT 'всё хорошо'
end
ELSE
begin
ROLLBACK 
SELECT 'всё плохо'
end


тут у меня и недопонимания. если конфликт произойдет скажем на третьем апдейте , то что произойдет ?
откатятся первый и второй - вряд ли ....

как должен выглядеть код исходя из определений транзакции и атомарности ?
26 июл 18, 12:23    [21603942]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
andron81,

@@ERROR только на последнюю инструкцию

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017
26 июл 18, 12:27    [21603962]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
andron81,

Здесь смотреть ваш кейс
26 июл 18, 12:28    [21603965]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
andron81,

почитай ещё про SET XACT_ABORT {ON|OFF}
Всё откатится при ошибке, если этот параметр равен ON.
В предыдущих версиях по умолчанию Microsoft его устанавливал зачем-то в OFF.
26 июл 18, 12:38    [21604004]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
iap,

да нет. я всё это почитаю , конечно . спасибо.
как правильно сделать я догадываюсь
Я хочу прояснить это для себя.
просто я не пойму : вот есть определение транзакции, атомарности.
четко и ясно написано : набор команд который рассматривается как единое целое кот. может выполнится , а может нет - в последнем случае откат.
но почему я должен в этом случае юзать всякие велосипеды типа @@ERROR или вот catch ??
26 июл 18, 12:46    [21604043]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
Yasha123
alexeyvg
пропущено...
Или такой:
insert
insert
insert

это 3 транзакции, а не 1
С чего это, если установлена опция автоначала транзакции?
26 июл 18, 12:54    [21604065]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
TaPaK
andron81,

@@ERROR только на последнюю инструкцию

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017


так в этом то и суть. с чего вообще @@ERROR этот нужен ? определение транзакции это набор инструкций которые совершают модификацию с б.д. (insert, update, delete). какие там проверки на @@ERROR ? :)
26 июл 18, 12:56    [21604069]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
andron81
TaPaK
andron81,

@@ERROR только на последнюю инструкцию

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017


так в этом то и суть. с чего вообще @@ERROR этот нужен ? определение транзакции это набор инструкций которые совершают модификацию с б.д. (insert, update, delete). какие там проверки на @@ERROR ? :)
\
есть люди, которые предпочитают управлят такими вещами как откаты и тп
26 июл 18, 12:59    [21604073]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
TaPaK
andron81
пропущено...


так в этом то и суть. с чего вообще @@ERROR этот нужен ? определение транзакции это набор инструкций которые совершают модификацию с б.д. (insert, update, delete). какие там проверки на @@ERROR ? :)
\
есть люди, которые предпочитают управлят такими вещами как откаты и тп


тогда и определение транзакций должно быть другим . имхо ))))
26 июл 18, 13:01    [21604082]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
andron81
да нет. я всё это почитаю , конечно . спасибо.
как правильно сделать я догадываюсь
Я хочу прояснить это для себя.
Предыдущие ответы как раз описывают, что произойдёт, т.к. это зависит от настроек сервера и коннекта.
andron81
просто я не пойму : вот есть определение транзакции, атомарности.
четко и ясно написано : набор команд который рассматривается как единое целое кот. может выполнится , а может нет - в последнем случае откат.
но почему я должен в этом случае юзать всякие велосипеды типа @@ERROR или вот catch ??
Потому что разные варианты обработки не нарушают эту целостность и атомарность.

Понимаете, "транзакция" - это не декларативное понятие, типа как трай-кэтч в разных ЯП, типа "указание рассматривать этот блок как единое целое", это некая команда серверу, потому что для идеологии существующих СУБД декларативно сделать транзакцию принципиально невозможно.

Если же вы рассмотрите транзакцию как команду перевода сервера (коннекта) в некий статус, то всё встанет на свои места.
26 июл 18, 13:02    [21604084]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
Yasha123
пропущено...

это 3 транзакции, а не 1
С чего это, если установлена опция автоначала транзакции?

авто_кто установлен?
---
наверное с того, что если кто-то использует что-то, отличное от общепринятых умолчаний,
то об этом надо сообщать?
26 июл 18, 13:06    [21604100]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
andron81
определение транзакции это набор инструкций которые совершают модификацию с б.д. (insert, update, delete). какие там проверки на @@ERROR ? :)
Нет, это не так, и важно, что сделать так принципиально неосуществимо.

Потому что нет "набора инструкций" для сервера, если команды, которые по очереди передаются по сети в сервер.
А вы при этом управляете статусом.

Например, в вашем примере
BEGIN TRANSACTION
update BOOK_PURCH1 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES2 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES3 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES4 set CONTRACTOR = @newname where CONTRACTOR = @oldname
COMMIT TRANSACTION

Скажем, BOOK_SALES2 завершилось неудачно, с ошибкой.

Помня о том, что транзакция - это некое состояние, можем ли мы продолжить обновлять BOOK_SALES3 и 4 в той же транзакции? Да, можем, почему бы и нет, если нам это нужно.

Но если не хотим такого поведения, то режим SET XACT_ABORT ON может откатить транзакцию и завершить весь батч.

В общем, всё достаточно гибко и управляемо.
26 июл 18, 13:07    [21604106]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30726
Yasha123
alexeyvg
пропущено...
С чего это, если установлена опция автоначала транзакции?

авто_кто установлен?
---
наверное с того, что если кто-то использует что-то, отличное от общепринятых умолчаний,
то об этом надо сообщать?
Наверное, не надо обобщённо утверждать, что если нет стейтмента BEGIN TRANSACTION, то три инсёрта будут тремя разными транзакциями
26 июл 18, 13:08    [21604112]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
alexeyvg
Скажем, BOOK_SALES2 завершилось неудачно, с ошибкой.

Помня о том, что транзакция - это некое состояние, можем ли мы продолжить обновлять BOOK_SALES3 и 4 в той же транзакции? Да, можем, почему бы и нет, если нам это нужно.


да, почему бы и нет. допускаю, что это не нарушает определение транзакции. Но в этом случае дойдя до конца, мы всё равно должны сделать откат. иначе нарушается условие атомарности.
26 июл 18, 13:15    [21604140]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
andron81
alexeyvg
Скажем, BOOK_SALES2 завершилось неудачно, с ошибкой.

Помня о том, что транзакция - это некое состояние, можем ли мы продолжить обновлять BOOK_SALES3 и 4 в той же транзакции? Да, можем, почему бы и нет, если нам это нужно.


да, почему бы и нет. допускаю, что это не нарушает определение транзакции. Но в этом случае дойдя до конца, мы всё равно должны сделать откат. иначе нарушается условие атомарности.

я так понимаю вы оглавление в книге по sql прочитали, дальше не приступали?
26 июл 18, 13:22    [21604166]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
Yasha123
пропущено...

авто_кто установлен?
---
наверное с того, что если кто-то использует что-то, отличное от общепринятых умолчаний,
то об этом надо сообщать?
Наверное, не надо обобщённо утверждать, что если нет стейтмента BEGIN TRANSACTION, то три инсёрта будут тремя разными транзакциями

а я где-то такое утверждаю?
я вообще не спрашиваю, есть ли у вас BEGIN TRAN,
может есть строкой выше, и вы его не показываете из вредности.

я утверждаю, что написанный вами код, это 3 транзакции.
а если это лишь кусок кода, то уж простите, ваши проблемы, что вы не показали BEGIN TRAN
или SET IMPLICIT_TRANSACTIONS ON
26 июл 18, 13:23    [21604175]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
TaPaK
andron81
пропущено...


да, почему бы и нет. допускаю, что это не нарушает определение транзакции. Но в этом случае дойдя до конца, мы всё равно должны сделать откат. иначе нарушается условие атомарности.

я так понимаю вы оглавление в книге по sql прочитали, дальше не приступали?



у меня книга одна , она вообще дебильная . по их определению и "select * from table" это тоже является транзакцией. стоит ли читать такую книгу ?
26 июл 18, 13:25    [21604181]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
KRS544
Member

Откуда:
Сообщений: 497
andron81, ну вы сначала прочитали данные, на их основе сделали какие-то подсчеты, потом пытаетесь внести изменения, а тут бац, ваш select выдает уже совершенно другие данные...
26 июл 18, 13:47    [21604283]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 787
KRS544
andron81, ну вы сначала прочитали данные, на их основе сделали какие-то подсчеты, потом пытаетесь внести изменения, а тут бац, ваш select выдает уже совершенно другие данные...


это к чему ? не могу уловить
26 июл 18, 13:49    [21604297]     Ответить | Цитировать Сообщить модератору
 Re: понятие транзакции. просьба разъяснить.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
andron81
KRS544
andron81, ну вы сначала прочитали данные, на их основе сделали какие-то подсчеты, потом пытаетесь внести изменения, а тут бац, ваш select выдает уже совершенно другие данные...


это к чему ? не могу уловить

он тоже только оглавление прочитал
26 июл 18, 13:50    [21604301]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить