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

Откуда: Москва
Сообщений: 877
Текущая транзакция не может быть зафиксирована и не может поддерживать операции, производящие запись в файл журнала. Выполните откат транзакции.

Всем привет. Объясните, что это за ошибка и как с ней бороться.
Ошибка возникает при таком запросе:

 insert into tbl_buh_status_history
  (report_id, report_state, comment, "SF_NUM")
 select
  h.report_id, h.report_state, h.comment, r.SF_NUM
   from
    (select @report_id report_id, @report_state report_state, @comment comment) h
     left outer join "tbl_buh_bn_reports" r (nolock) on h.report_id = r."Report_ID";


Подскажите, какую транзакцию просит откатить сервер и как её обнаружить?
26 фев 21, 14:24    [22286955]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Konst_One
Member

Откуда:
Сообщений: 11600
(nolock) грязное чтение не используйте

Сообщение было отредактировано: 26 фев 21, 14:19
26 фев 21, 14:26    [22286958]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Владислав Колосов
Member

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

Если отчет был удалён во время выполнения до фиксации, то получите эту ошибку из-за (nolock), грязного чтения.
26 фев 21, 14:48    [22286978]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37232
Konst_One
(nolock) грязное чтение не используйте
nolock тут ни при чем.

teCa
Подскажите, какую транзакцию просит откатить сервер и как её обнаружить?
Текущкю транзакцию, в которой выполняется этот запрос.
26 фев 21, 14:48    [22286979]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37232
Владислав Колосов
teCa,

Если отчет был удалён во время выполнения до фиксации, то получите эту ошибку из-за (nolock), грязного чтения.
Нет. Это про uncommitable transactions. Прочитать можно вот тут, например: https://docs.microsoft.com/ru-ru/sql/t-sql/functions/xact-state-transact-sql?view=sql-server-ver15
26 фев 21, 14:51    [22286982]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8587
Гавриленко Сергей Алексеевич,

насколько мне известно, uncommitable возникает при необработанном исключении при xact_abort off. В случае неявной транзакции возникает, как правило, автоматический откат текущей при любом xact_abort, в случае явной указанная ошибка возникает при попытке фиксации.

У ТС ошибка возникает не при попытке фиксации явной транзакции, то есть ошибка возникает внутри самой инструкции Insert. Вопрос - по какой причине?

Возможен и такой вариант - при открытой явно транзакции произошло ранее необработанное исключение, которое препятствует выполнению insert into. То есть виновата не эта команда а та, которая была выполнена до неё. В таком случае проблема выхвачена из контекста.
26 фев 21, 15:02    [22286998]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37232
Владислав Колосов,

Может и эта команда виновата. Может триггер. Но точно не nolock сам по себе.
26 фев 21, 15:20    [22287014]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
teCa
Member

Откуда: Москва
Сообщений: 877
Подобная ситуация в другом месте встретилась:
Есть запрос, который выполняет внутри транзакции хранимку, эта хранимка выполняет запрос используя линкованный сервер, а в рзеультате возвращает 0 или 1.
declare 
 @axaptaRes int = -1,
 @BillId int = 28030;
begin try
 begin tran
  exec @axaptaRes = "proc_SendBnBillsInfoToBK" @BillId = @BillId;
  if @axaptaRes != 0
   rollback;
  else 
   commit;
end try
begin catch
 rollback;
 throw;
end catch



В результате выполнения, получаю ошибку:
автор
автор
Сообщение 3930, уровень 16, состояние 1, строка 10
Текущая транзакция не может быть зафиксирована и не может поддерживать операции, производящие запись в файл журнала. Выполните откат транзакции.



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

Посоветуйте, как диагностировать источник проблемы?
9 мар 21, 14:59    [22291714]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37232
teCa
Посоветуйте, как диагностировать источник проблемы?
Запускать профайлер, воспроизводить ситуацию и смотреть, где и какая возникает ошибка.
9 мар 21, 15:01    [22291717]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Yasha123
Member

Откуда:
Сообщений: 1973
XE-сессию повесьте на ошибки и уж точно выловится вам нужное.
у нас вон было такое,
так сама-то ошибка была при конвертировании:
Conversion failed when converting the nvarchar value ' color' to data type int.

поди в ваш "SF_NUM" пытаетесь записать значение, не конвертируемое в число.
в свой proc_SendBnBillsInfoToBK тоже добавьте try ..catch со throw внутри, чтобы плевал ошибку наверх

К сообщению приложен файл. Размер - 40Kb
9 мар 21, 15:16    [22291732]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
teCa
Member

Откуда: Москва
Сообщений: 877
Yasha123
XE-сессию повесьте на ошибки и уж точно выловится вам нужное.
у нас вон было такое,
так сама-то ошибка была при конвертировании:
Conversion failed when converting the nvarchar value ' color' to data type int.

поди в ваш "SF_NUM" пытаетесь записать значение, не конвертируемое в число.
в свой proc_SendBnBillsInfoToBK тоже добавьте try ..catch со throw внутри, чтобы плевал ошибку наверх


Можете подсказать, как настроить XE сессию с нужными параметрами, что-бы отловить подобные ошибки?
27 апр 21, 14:57    [22315137]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35083
Блог
teCa,

Связанные сервера есть в транзакции?
А на "той стороне", скажем, триггер, который смотрит обратно на исходный сервер?
27 апр 21, 19:09    [22315302]     Ответить | Цитировать Сообщить модератору
 Re: Текущая транзакция не может быть зафиксирована и не может поддерживать операции..  [new]
Yasha123
Member

Откуда:
Сообщений: 1973
вот пример моей, пишу сюда только sqlserver.error_reported
переделайте под себя:

ADD EVENT sqlserver.error_reported(   ACTION(sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.username)
    WHERE ([error_number]<>(5701) AND [error_number]<>(17830) AND [severity]>(14) AND NOT [client_app_name] like '%SQL Server Management Studio%' AND [database_id]<=(6)))


у меня фильтры на severity, потому что 14 это ошибки прав,
а 13 наши кастомные по договоренности для определенных сп,
5701 это Changed database context to '%.*ls'. и мне это не надо,
17830 тоже спам, Network error code 0x%x occurred while establishing a connection
AND NOT [client_app_name] like '%SQL Server Management Studio%' чтобы не ловить от юзеров ССМС
[database_id]<=(6) потому что тут системные базы и 2 наши основные, а что с database_id > 6 это идет в другой трэйс, не наше добро
27 апр 21, 19:15    [22315305]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить