Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Привет всем! Есть проблема. Процедура на MSS работает в транзакции. Когда запускаю эту же самую процедуру из VC-6 стандартно через АDO в стресс режиме(одновременное обращение более чем одного клиента, то все работает. Если запускаю эту же процедуру из C# .NET в "многоюзерном режиме", то получаю регулярно "Transaction (Process ID <номер>) was deadlocked on {lock} resources with another process and has been chosen as the deadlock victim. Rerun the transaction." . В процедуре нет кода, который мог бы вызвать deadlock, кроме этого из сишного кода она работает! Привожу кусок кода, вызывающего процедуру. Может кто сталкивался с подобной проблемой? Может какие-то ресурсы не освобождаю? Заранее спасибо. ////////////// IDbCommand command = null; IDbConnection connection = null; try { //здесь создается объекты в зависимост от базы(Oracle или MSS) имплементирующие один и тот же стандартный интерфейс InitDBObjects(strProcName, new Hashtable(), ref connection, ref command); command.CommandType = CommandType.StoredProcedure ; IDbDataParameter dataParameter = null; foreach(MyParam dbParam in Params)//from client { dataParameter = command.CreateParameter(); dataParameter.ParameterName = m_paramPrefixStoredProc dataParameter.Direction = dbParam.Direction; object objValue = dbParam.Value; dataParameter.Size = dbParam.Size; dataParameter.Value = objValue; command.Parameters.Add(dataParameter); } command.ExecuteNonQuery(); Results.Clear(); foreach(IDbDataParameter param in command.Parameters ) { if(param.Direction == ParameterDirection.Output || param.Direction == ParameterDirection.InputOutput || param.Direction == ParameterDirection.ReturnValue) Results.Add(param.ParameterName.Replace(m_paramPrefix, ""), param.Value); } } catch(Exception e) { throw new MyException(e); } finally { //close connection CleanupConnection(ref connection); } ////////////// ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 13:04 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Дедлоки - это проблема хранимки и сервера а не клиента, приведи процедурку. А лучше запусти трассу и посмотри кто кого лочит. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 19:04 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Кстати, один из вариантов - ловить номер ошибки(если не ошибаюсь 1251) и перезапускать транзакцию. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 19:13 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Для информации: триггеров нет на эту таблицу после того, как добавил WITH (NOLOCK) - локинг ушел. Где может быть дедлок? Все просто, по-моему.... Спасибо CREATE PROCEDURE sp_formula @formula_id varchar(30), @calculationinterval int, @lastvalue integer output, @formulatext varchar(50) output as declare @period_type char (1) declare @ap_last_value varchar(50) declare @ap_last_date datetime declare @ap_template varchar(50) BEGIN TRANSACTION select @period_type = period_type, @ap_last_date = ap_last_date, @formulatext = ap_template from ap_formula WITH (NOLOCK) where ap_formula_id = @formula_id BEGIN update ap_formula set ap_last_date = getdate(), ap_last_value = (select convert(int,ISNULL(ap_last_value,0)) + @calculationinterval from ap_formula where ap_formula_id = @formula_id) where ap_formula_id = @formula_id select @lastvalue = convert(int,ap_last_value) from ap_formula where ap_formula_id = @formula_id END COMMIT TRANSACTION ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 19:37 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
В трансакции не должно быть ничего лишнего, держи ее максимально короткой. Итак: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Т.е. первым селектом ты ее и залочил. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 21:53 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
А где смысл транзакции тогда? В твоем варианте вообще не надо никакой транзакции! В том коде, который ты прислал, при многопоточном обращении неизвестно, какой результат получит клиент! Если ты работал с этим, то сталкивался наверное! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 09:51 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
EvgenyV а в вашем случае транзакция и не нужна :) PS> Поставьте лучше в начале SP Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:31 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Есть одно маленькое "НО". Когда пользуюсь вашими советами, получаю больше одного раза одно и тоже значение! А поскольку процедура обеспечивает возврат уникального номера/стринга, не могу ей пльзоваться! Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:59 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
>Когда пользуюсь вашими советами, получаю больше одного раза одно и тоже значение! А поскольку процедура обеспечивает возврат уникального номера/стринга, не могу ей пльзоваться! А поподробнее это почему же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 11:16 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Что делает процедура: берет последний номер прибавляет, допустим 1 и возвращает клиенту. Если два клиента получат один и тот же номер - очень плёхо :). Будет, например, два человека с одним и тем же номером паспорта... или банковского счета - выбирай, что лучше :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 11:32 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Да, стормозил я маленько. Явная транзакция тут вообще не нужна. ap_formula_id уникальное значение? Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 15:01 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Возможно вы привели не весь код - но для указанного фрагмента транзакция не нужна :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 18:22 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
В этом все дело, что уникальное. Самое прикольное, что если клиенты C++ COM, то все ок! А если .NET, но начинается эта фигня! Как я уже и писал WITH (NOLOCK) решает проблему и локировки нет и уникальность сохраняется. Все равно не могу понять, почему вообще локировался процесс... Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 22:20 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
funikovyuri - привел весь код! Почему же не нужна транзакзия ? Нужна. Тогда зачем вообще транзакция существует? Просто долго писать и объяснять почему :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 22:25 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Давайте разберемся, что есть ap_last_value? При данныой конструкции и N клиентов если не блокировать таблицу, то всегда есть вероаятность что новый вызов успеет прочитать значение до апдейта. Выходы: 1. Таки блокировать, ловить ошибку и перезапускать. 2. Использовать встроенные средства для разруливания ситуации, т.е. ap_last_value - identity. Выставляйте ему seed и возвращайте Код: plaintext Вот это Самое прикольное, что если клиенты C++ COM, то все ок! А если .NET, но начинается эта фигня совсем не понятно. Проблема чисто серверная , отношения к клиенту не имеет. хм.. но если вы так говорите, давайте посмотрим. Запустите трассу в обоих случаях и посмотрите что запускается на сервере. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 23:06 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Magnus, спасибо за советы. К сожалению, identity не могу использовать - поддержка предыдущих старых версий. Единственная разница на трассировке (с одинаковым по умолчанию фильтром сообщений. Может Вы знаете, какую полезную инфо можно добавить в трассировку?) в том, что ADO client запускает каждый раз Audit Login, который включает в себя набор команд -- network protocol: LPC set quoted_identifier on set implicit_transactions off set cursor_close_on_commit off set ansi_warnings on set ansi_padding on set ansi_nulls on set concat_null_yields_null on set language us_english set dateformat mdy set datefirst 7 Я эти команды вставил в начало процедуры - никакого результата. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 10:02 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Нравиться мне когда говорят о транзакции - а ставят nolock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 14:57 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
да я понимаю...что ничего не понимаю...:) на самом деле! без "no lock" в транзакции - blocking, без транзакции без "no lock" - некорректные данные. работает вариант с "no lock" в транзакции...почему? не знаю. пока работает - пусть работает :) трогать не буду. как только упаду первый раз на "key violation" с полученным номером - буду думать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 15:43 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Знач так, set implicit_transactions off - это было в варинте без транзакции? пробуем вот так: SET TRANSACTION ISOLATION LEVEL READ COMMITTED это должно быть установлено для каждого коннекта. Вместе с транзакцией, как и было в начале. Ждем результатов. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 16:24 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
EvgenyV Я немного начинаю понимать :) В частности заметил output параметры... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Такое точно будет работать А вот вариант получше - но это только мои догадки - так как я не понял зачем надо было last_value брать новое а ap_last_date - старое :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 16:37 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
еще могу сказать почему у вас работает вариант с nolock :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 16:38 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
А вот READ UNCOMMITTED думаю тут лишнее. Здесь вариант довольно простой, вызов один и тот же, тот же порядок операторов, поэтому READ COMMITTED с транзакцией. Дедлоков быть не должно. By Design. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 16:42 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Ой... Там конечно же должен быть READ COMMITED .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 16:58 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
Во-первых, всем спасибо!!!!! Зашел из дома посмотреть, не выдержал:) По поводу ap_last_date - просто я выбросил лишний код, который использует в дальнейшем этот параметр. В данном случае он совсем не нужен. Работает только приведенный мной кусок кода. funikovyuri - А что с out параметрами? Они каким-то образом влияют? Народ, если мне не изменяет память, если мы пишем BEGIN TRANSACTION, то по умолчанию это - BEGIN TRANSACTION READ COMMITED. Спасибо Буду на работе проверю все варианты! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 23:51 |
|
||
|
MSS и дедлок при запуске stored procedure...
|
|||
|---|---|---|---|
|
#18+
А вот здесь начинается самое интересное. При использовании COM для связи с сиквелом уровень насильно выставляется как Serializable. Так что, попробуйте SET TRANSACTION ISOLATION LEVEL READ COMMITTED Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2004, 00:30 |
|
||
|
|

start [/forum/topic.php?fid=20&fpage=1031&tid=1439369]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 376ms |

| 0 / 0 |
