![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TADOStoredProc + deadlock [D5, MSSQL]
Дуся © (2002-10-24 16:26:00)Хочу поделиться открытием! Вдруг кто не знает?..
Прямо таки недокументированная возможность ...
Имею на MSSQL 2000 процедуру, которая вызывает внутри еще одну, которая что-то там себе делает:
CREATE PROCEDURE dbo.sp_call_error
AS
begin transaction
exec sp_test_error
commit
GO
При работе sp_test_error возникает deadlock. Но перед этим успешно проходит какая-то ее часть, возвращая некий рекордсет, после чего вываливает deadlock, что очень хорошо видно из консоли:
(0 row(s) affected)
Server: Msg 1205, Level 13, State 54, Procedure sp_test_error, Line 12
Transaction (Process ID 56) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Так вот, в коде делаю вызов этой процедуры:
ADOStoredProc1.ProcedureName := "sp_call_error";
ADOStoredProc1.ExecProc;
В результате чего Exception не случается!!!!
А чтобы он все же случился, придется делатьADOStoredProc1.ExecuteOptions:=[eoExecuteNoRecords]
Тогда и только тогда все рекордсеты игнорируются и мы получаем долгожданный EOleException!..
Простите, если кому-то вопрос показался очевидным. Я билась три дня.
Дуся (2002-10-24 18:45:00) [1]Да знаю я, и пример смоделировала специально.
Только там такой сложный процесс онлайн идет - без поллитры не разберешься!...
Изменения идут постоянно, несколько раз в секунуд, разными процедурами, плюс пользователи....
А можно как-то в этом примере внутри внешней процедуры понять, что во вложеной случилась беда?..
Johnmen (2002-10-24 17:57:00) [2]Тогда поясню.
deadlock возникает, когда в рамках стартованной тр-ии предпринимается попытка изменить данные, уже измененные другой тр-ей, стартованной ранее и изменившей данные после старта второй...
Короче - аккуратнее ! :)))
Дуся (2002-10-24 17:47:00) [3]Ну это в тестовом примере так. на самом деле там вроде как содержательно она нужна....
Johnmen (2002-10-24 17:29:00) [4]Поаккуратнее с транзакциями !
Убери ненужную в sp_call_error.