C3p0 - APPARENT DEADLOCK на MSSQL, но не на PostgreSQL или MySQL - PullRequest
6 голосов
/ 23 января 2012

Мы получаем исключения, подобные этому

com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@5b7a7896 -- APPARENT DEADLOCK!!! Complete Status: 
Managed Threads: 3
Active Threads: 3
Active Tasks: 
    com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@55bc5e2a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
    com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@41ca435f (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
    com.mchange.v2.c3p0.stmt.GooGooStatementCache$1StatementCloseTask@460d33b7 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
Pending Tasks: 

при нагрузочном тестировании нашего приложения на MSSQL 2008 R2 (jTDS или официальный MS JDBC не имеет значения) .Мы никогда не получим это исключение при запуске тех же тестов для PostgreSQL или MySQL .

Мы не просто хотим увеличить количество вспомогательных потоков для c3p0 (чторешает проблему, но как долго?).Мы хотим знать, в чем проблема, так как она работает с другими СУБД.

Приложения ведут себя так:

  • Отправка X запросов
  • Подождите немного -> DEADLOCK
  • Отправка X запросов
  • Подождите немного -> DEADLOCK

Кто-нибудь знает или имеет представление о том, почему у нас такое поведение с MSSQL?

Спасибо, Адриан

(Кстати, BoneCP тоже работает без проблем.)

1 Ответ

3 голосов
/ 23 января 2012

SQL Server имеет гораздо более строгую стратегию блокировки по сравнению с PostgreSQL или InnoDB.

Особенно он будет блокировать SELECT для строк (таблиц?), Которые обновляются из другого соединения / транзакции (при установке по умолчанию).

Вы должны убедиться, что вы не выбираете в одном сеансе те же строки, которые обновляются из другого.

Если вы не можете изменить последовательность своего кода, вам может не понравиться использование «грязных чтений» в SQL Server.

Если я правильно помню, это достигается добавлением WITH NOLOCK к операторам SELECT (но я не совсем уверен)

Редактировать
Другая возможность (если вы используете SQL Server 2005 или более позднюю версию) - использовать новую «изоляцию моментальных снимков», чтобы избежать блокировки выбора.

...