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

Откуда:
Сообщений: 27
Есть следующий код

BEGIN TRAN
INSERT...
UPDATE...
COMMIT TRAN

Если insert и update выполнились корректно, в каких случаях оператор commit tran может не выполниться?
18 окт 11, 10:00    [11456903]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
Glory
Member

Откуда:
Сообщений: 104751
FreddieM
в каких случаях оператор commit tran может не выполниться

когда транзакции уже нет
18 окт 11, 10:18    [11457012]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
FreddieM,

или если возникла взаимоблокировка и процесс выбран в качестве жертвы...
18 окт 11, 10:27    [11457065]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SomewhereSomehow
FreddieM,

или если возникла взаимоблокировка и процесс выбран в качестве жертвы...
хотя если инструкции уже выполнились, то наверное подразумевается что никаких взаимоблокировок нет и никто никого не ждет.
18 окт 11, 10:31    [11457096]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
FreddieM
Если insert и update выполнились корректно, в каких случаях оператор commit tran может не выполниться?
Причин много может быть, можно месяц придумывать...

А зачем вам, задача-то какая?
18 окт 11, 10:59    [11457270]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
aleks2
Guest
FreddieM
Если insert и update выполнились корректно, в каких случаях оператор commit tran может не выполниться?

Что есть "не выполниться" в вашем понимании?
Ибо если исполнение дошло до оператора - сервер его выполнит ВСЕГДА.
18 окт 11, 11:43    [11457599]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
aleks2
Guest
[quot alexeyvg]
FreddieM
Если insert и update выполнились корректно, в каких случаях оператор commit tran может не выполниться?
Причин много может быть, можно месяц придумывать...
[quot]
Назовите хотя бы одну.
18 окт 11, 11:44    [11457618]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
aleks2
Назовите хотя бы одну.

Аппаратный сбой...
18 окт 11, 11:51    [11457715]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
FreddieM
Member

Откуда:
Сообщений: 27
aleks2
FreddieM
Если insert и update выполнились корректно, в каких случаях оператор commit tran может не выполниться?

Что есть "не выполниться" в вашем понимании?
Ибо если исполнение дошло до оператора - сервер его выполнит ВСЕГДА.

Всмысле отвалится по какой-либо причине с ошибкой...
18 окт 11, 11:54    [11457784]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
aleks2
Guest
FreddieM
aleks2
пропущено...

Что есть "не выполниться" в вашем понимании?
Ибо если исполнение дошло до оператора - сервер его выполнит ВСЕГДА.

Всмысле отвалится по какой-либо причине с ошибкой...


Если это НЕ распределенная транзакция и "аппраратных сбоев" нема, то COMMIT выполнится всегда. Ибо фсе уже сделано. Осталось тока снять блокировки.
18 окт 11, 12:15    [11458038]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
aleks2
Ибо фсе уже сделано. Осталось тока снять блокировки.
Не, надо еще этот самый commit в журнал записать. Вот тут-то и может подстеречь аппаратный сбой, или недостаток свободного места в журнале, или...
18 окт 11, 12:50    [11458457]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
aleks2
Guest
invm
aleks2
Ибо фсе уже сделано. Осталось тока снять блокировки.
Не, надо еще этот самый commit в журнал записать. Вот тут-то и может подстеречь аппаратный сбой, или недостаток свободного места в журнале, или...

1. Сами придумали? Или могете подтвердить независимой ссылкой?
2. Данные транзакции пишутся в журнал "в процессе" и к моменту исполнения COMMIT усе уже записано.
3. Остается тока галочку "Зотверждаю" поставить.
18 окт 11, 13:31    [11458872]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
aleks2
alexeyvg
FreddieM
Если insert и update выполнились корректно, в каких случаях оператор commit tran может не выполниться?
Причин много может быть, можно месяц придумывать...

Назовите хотя бы одну.
Переполнился лог-файл.
18 окт 11, 13:41    [11458967]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
aleks2
Ибо если исполнение дошло до оператора - сервер его выполнит ВСЕГДА.
Выполнит, но в памяти, в кеше.

Вы же не думаете, что после каждого оператора происходит физическая запись на диск, и только потом выполнение продолжается?
18 окт 11, 13:43    [11458987]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
aleks2
invm
пропущено...
Не, надо еще этот самый commit в журнал записать. Вот тут-то и может подстеречь аппаратный сбой, или недостаток свободного места в журнале, или...

1. Сами придумали? Или могете подтвердить независимой ссылкой?
2. Данные транзакции пишутся в журнал "в процессе" и к моменту исполнения COMMIT усе уже записано.
3. Остается тока галочку "Зотверждаю" поставить.


видимо галочка "Зотверждаю", всерно выглядит как запись в том же логе.
Ради интереса посмотрел что записывается командой DBCC LOG.
create database LogTest
go
use LogTest
go
create table dbo.LogTable(a int)
go
select db_id()
go
begin tran
insert into dbo.LogTable select 1
update dbo.LogTable set a = 2
commit tran
До момента commit у меня DBCC LOG выдает 363 записи, после 364, последняя запись:
00000015:000000b0:0002 LOP_COMMIT_XACT LCX_NULL 0000:0000020e 0

Конечно, DBCC LOG - команда недокументированная и "мало ли че она там выдает", но шибко похоже на правду, да и логично ведь, должен же фиксироватсья факт завершения транзакции. И чисто теоретически, если сервер по какой-то причине не сможет сделать эту запись в журнале, то наверное commit должен завершиться ошибкой.
18 окт 11, 13:56    [11459149]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
SomewhereSomehow
Конечно, DBCC LOG - команда недокументированная и "мало ли че она там выдает", но шибко похоже на правду, да и логично ведь, должен же фиксироватсья факт завершения транзакции. И чисто теоретически, если сервер по какой-то причине не сможет сделать эту запись в журнале, то наверное commit должен завершиться ошибкой.
Там и сами записи делаются при коммите.

Это можно в статьях прочитать, и в документации, и даже самому проверить.

Простой способ ускорения в разы пакета из множества мелких insert...values... обёртыванием их в транзакцию это подтверждает.
18 окт 11, 14:05    [11459253]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
alexeyvg
Там и сами записи делаются при коммите.

Это можно в статьях прочитать, и в документации, и даже самому проверить.

Простой способ ускорения в разы пакета из множества мелких insert...values... обёртыванием их в транзакцию это подтверждает.

Ну вот насчет самих записей у меня почему-то в эксперименте не подтвердилось, я выполнил приведенный выше скрипт до строки коммит, выполнил в другом окне DBCC LOG(13), (13 - такую ид у меня получила созданная бд), потом сделал коммит, и снова DBCC LOG(13), - кол-во строк увеличилось на одну, какую - привел выше. Может это не репрезентативный эксперимент?
18 окт 11, 14:11    [11459339]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
alexeyvg
Простой способ ускорения в разы пакета из множества мелких insert...values... обёртыванием их в транзакцию это подтверждает.
А это мне кажется признак не того что все делается на коммит, а того, что если много мелких insert...values... не обернуты в одну явную транзакцию, то каждый из стейтментов порождает свою неявную, т.е. одна большая vs много мелких, и видимо от этого происходит выигрыш. Хотя я, конечно, могу ошибаться, т.к. специально данной темой не занимался, но все равно интересно.
18 окт 11, 14:16    [11459399]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
alexeyvg
SomewhereSomehow
Конечно, DBCC LOG - команда недокументированная и "мало ли че она там выдает", но шибко похоже на правду, да и логично ведь, должен же фиксироватсья факт завершения транзакции. И чисто теоретически, если сервер по какой-то причине не сможет сделать эту запись в журнале, то наверное commit должен завершиться ошибкой.
Там и сами записи делаются при коммите.

Это можно в статьях прочитать, и в документации, и даже самому проверить.

Простой способ ускорения в разы пакета из множества мелких insert...values... обёртыванием их в транзакцию это подтверждает.
Ну вообще объединение в транзакцию не более, чем просто сокращает число COMMIT-ов.
А любое изменение данных всегда пишется в лог в синхронном режиме, то есть до завершения оператора.
18 окт 11, 14:39    [11459677]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
aleks2
Guest
alexeyvg
Вы же не думаете, что после каждого оператора происходит физическая запись на диск, и только потом выполнение продолжается?

Я не думаю. Я знаю, что это так.
Исключение - TEMPDB.
18 окт 11, 14:52    [11459780]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
iljy
Member

Откуда:
Сообщений: 8711
aleks2
alexeyvg
Вы же не думаете, что после каждого оператора происходит физическая запись на диск, и только потом выполнение продолжается?

Я не думаю. Я знаю, что это так.
Исключение - TEMPDB.

Чушь. Физическая запись обязательно происходит при выполнении CHECKPOINT. До этого все вполне себе спокойно может болтаться в кешах. Дополнительно при выполнении CHECKPOINT соблюдается принцип WAL, для чего у файлов лога отключается системное кеширование записи (FILE_WRITE_THROUGH).
18 окт 11, 14:57    [11459834]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
iljy
aleks2
пропущено...

Я не думаю. Я знаю, что это так.
Исключение - TEMPDB.

Чушь. Физическая запись обязательно происходит при выполнении CHECKPOINT. До этого все вполне себе спокойно может болтаться в кешах. Дополнительно при выполнении CHECKPOINT соблюдается принцип WAL, для чего у файлов лога отключается системное кеширование записи (FILE_WRITE_THROUGH).
При записи в любые (дата и лог) файлы соблюдается WAL.
сключение - tempdb.
Разница между данными и логом в том, что в лог запись идет в синхронном режиме, а данные меняются в фоновых процессах.
18 окт 11, 15:00    [11459857]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Статья на тему.
18 окт 11, 15:01    [11459866]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
iljy
Member

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

честно говоря, я не очень понял, как статья противоречит моим словам. Вы хотите сказать, что запись в лог вообще не кешируется? Но это не так
http://msdn.microsoft.com/ru-ru/library/ms186259.aspx
Во время изменения страницы в буфере запись журнала строится в кэше журнала, который записывает изменение. Данная запись журнала должна быть перенесена на диск до того, как соответствующая «грязная» страница будет записана из буферного кэша на диск.
...
Содержимое журнала запишется на диск после того, как будут зафиксированы транзакции.

Ровно это я и утверждаю, говоря, что обязательная запись идет только при выполнении CHECKPOINT. Вас смутила фраза, что WAL собрюдается только при CHECKPOINT? Тут я действительно некорректно выразился, принцип конечно же соблюдается всегда. Для всех баз, кроме TEMPDB разумеется.
18 окт 11, 15:17    [11460065]     Ответить | Цитировать Сообщить модератору
 Re: В каких случаях оператор commit tran может не выполниться?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
iljy
Содержимое журнала запишется на диск после того, как будут зафиксированы транзакции.
Перевод кривой.
Оригинал:
автор
Log records are written to disk when the transactions are committed
"when" - это никак не "после".
18 окт 11, 15:22    [11460118]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить