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

Откуда:
Сообщений: 8
Версия сервера: Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) Jun 17 2011 00:57:23 Copyright (c) Microsoft Corporation Enterprise Edition on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (WOW64) (Hypervisor)


В общем, суть вопроса:

В SQL приложении вызывается хранимая процедура

INSERT INTO @TUBES_DATA EXEC dbo.TubesCalc @CalcData=@DATA


Внутри, находится курсор, в котором производится вызов сложной математической функции, в которой при некорректных данных вылетает Exception (так и задумано, проверить корректность входных данных очень сложно)

Функция обёрнута в try...catch:
BEGIN TRY 								   
			SET @TempFlow	= dbo.f_FlowRate(.......)
END TRY	
BEGIN CATCH
-- пишется инфа об ошибке в таблицу логов
		EXEC dbo.SetError
		     @eCode=254,@eObject=5;
		
END CATCH	


Так вот, после того как вылетает Exception практически при попытке выполнить любой запрос, будь то запись в лог ошибок(exception в блоке catch!!), или select перед выходом из хранимой процедуры для возврата результата.



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


При этом никаких транзакций я не открывал.
19 июл 13, 09:18    [14587505]     Ответить | Цитировать Сообщить модератору
 Re: ошибка 3930  [new]
Гость333
Member

Откуда:
Сообщений: 3683
sapphire.nk
При этом никаких транзакций я не открывал.

А это, по-вашему, не в транзакции выполняется?
INSERT INTO @TUBES_DATA EXEC dbo.TubesCalc @CalcData=@DATA

Хинт: есть такая вещь, как неявная транзакция.
19 июл 13, 09:45    [14587647]     Ответить | Цитировать Сообщить модератору
 Re: ошибка 3930  [new]
sapphire.nk
Member

Откуда:
Сообщений: 8
Гость333
Хинт: есть такая вещь, как неявная транзакция.

Спасибо, не знал. Если во время транзакции вылетает исключение, то невозможно сохранить какие либо данные в БД, до тех пор, пока транзакция не откатится?
19 июл 13, 10:21    [14587877]     Ответить | Цитировать Сообщить модератору
 Re: ошибка 3930  [new]
Гость333
Member

Откуда:
Сообщений: 3683
sapphire.nk
Если во время транзакции вылетает исключение, то невозможно сохранить какие либо данные в БД, до тех пор, пока транзакция не откатится?

Всё зависит от типа исключения. Бывает, что можно сохранить, бывает — что нет.
+ Деление на 0 - можно делать коммит
CREATE TABLE #test (id int);
GO
BEGIN TRANSACTION;
BEGIN TRY
   INSERT #test(id) VALUES(1);
   INSERT #test(id) VALUES(1/0);
   COMMIT TRANSACTION;
END TRY
BEGIN CATCH
   COMMIT TRANSACTION;
END CATCH;
GO
SELECT * FROM #test;
GO
DROP TABLE #test;

+ Логарифм нуля - "Текущая транзакция не может быть зафиксирована"
CREATE TABLE #test (id int);
GO
BEGIN TRANSACTION;
BEGIN TRY
   INSERT #test(id) VALUES(1);
   DECLARE @f float;
   SET @f = 0;
   INSERT #test(id) VALUES(LOG(@f));
   COMMIT TRANSACTION;
END TRY
BEGIN CATCH
   COMMIT TRANSACTION;
END CATCH;
GO
SELECT * FROM #test;
GO
DROP TABLE #test;


Возможность/невозможность коммита транзакции проверяют при помощи функции XACT_STATE(). То есть правильный код может выглядеть примерно так:
+ Анализ значения XACT_STATE()
CREATE TABLE #test (id int);
GO
BEGIN TRANSACTION;
BEGIN TRY
   INSERT #test(id) VALUES(1);
   DECLARE @f float;
   SET @f = 0;
   INSERT #test(id) VALUES(LOG(@f));
   COMMIT TRANSACTION;
END TRY
BEGIN CATCH
   IF XACT_STATE() = 1
   BEGIN
      PRINT 'Транзакцию можно зафиксировать, commit'
      COMMIT TRANSACTION;
   END;
   
   IF XACT_STATE() = -1
   BEGIN
      PRINT 'Транзакцию нельзя зафиксировать, rollback'
      ROLLBACK TRANSACTION;
   END;
END CATCH;
GO
SELECT * FROM #test;
GO
DROP TABLE #test;
19 июл 13, 10:35    [14587970]     Ответить | Цитировать Сообщить модератору
 Re: ошибка 3930  [new]
sapphire.nk
Member

Откуда:
Сообщений: 8
Спасибо! Прийдётся вытаскивать код за пределы процедуры, rollback внутри не работает.
19 июл 13, 11:13    [14588276]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: ошибка 3930  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
Здравствуйте!
Случилась подобная ситуёвина!

Условия все теже что и в посте №1: аналогичный запрос, аналогичные предупреждения деления на Ноль!

Но:
запрос из стороннего приложения при EXEC <procedude> выдает ошибку,
а с SQLSMS пролетает успешно!

В чём прикол так и не понятно!

Приколы, типа проверь правописание и там и там - просьба опустить.
11 окт 17, 14:43    [20861101]     Ответить | Цитировать Сообщить модератору
 Re: ошибка 3930  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Прикол в кривом коде, который иногда может не выдавать ошибку деления на ноль.
Или прикол в кривом коде, который обрабатывает ошибку и пытыется что-то писать в uncommitable транзакции.

Какой вам больше по душе, тот и правьте.
11 окт 17, 14:53    [20861148]     Ответить | Цитировать Сообщить модератору
 Re: ошибка 3930  [new]
o-o
Guest
сравните set options обеих сессий.
в SSMS по умолчанию xact_abort off,
ну а вприложении, похоже, xact_abort on
---
попробуйте выполнить код от Гость333 ,
выставив опцию в on/off:
set xact_abort on; -- off
CREATE TABLE #test (id int);
GO
BEGIN TRANSACTION;
BEGIN TRY
   INSERT #test(id) VALUES(1);
   INSERT #test(id) VALUES(1/0);
   COMMIT TRANSACTION;
END TRY
BEGIN CATCH
   COMMIT TRANSACTION;
END CATCH;
GO
SELECT * FROM #test;
GO
DROP TABLE #test;
11 окт 17, 15:23    [20861272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить