2012-01-23 15 views
6

Estamos recibiendo excepciones como estaC3p0 - aparente punto muerto en MSSQL, pero no PostgreSQL o MySQL

com[email protected]5b7a7896 -- APPARENT DEADLOCK!!! Complete Status: 
Managed Threads: 3 
Active Threads: 3 
Active Tasks: 
    co[email protected]55bc5e2a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
    co[email protected]41ca435f (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
    co[email protected]460d33b7 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
Pending Tasks: 

cuando la carga de probar nuestra aplicación en MSSQL 2008 R2 (jTDS o funcionario MS JDBC no importa) . Nunca obtenemos esta excepción cuando ejecutamos las mismas pruebas contra PostgreSQL o MySQL.

No solo queremos aumentar el número de subprocesos auxiliares para c3p0 (lo que resuelve el problema, pero ¿durante cuánto tiempo?). Queremos saber cuál es el problema ya que funciona con otros DBMS '.

Las aplicaciones se comporta como:

  • Enviar X solicita
  • Espere un momento -> DEADLOCK
  • Enviar X solicita
  • Espere un momento -> DEADLOCK

¿Alguien sabe o tiene una idea de por qué tenemos este comportamiento con MSSQL?

Gracias, Adrian

(BTW. BoneCP funciona sin ningún tipo de problema también.)

+0

¿Qué es esta utilidad y por qué informa "aparente interbloqueo" en lugar de un punto muerto real? SQL Server detectará deadlocks reales. Puede rastrear el gráfico de interbloqueo para luego diagnosticar por qué ocurre. –

+0

Hola Martin, SQL Server en sí no tiene bloqueos. Parece ser solo c3p0 (una biblioteca que agrupa lib para Java) asume que hubo un interbloqueo. – Adrian

+0

Adrian: ¿puede aclarar si el uso de BoneCP evitó el problema? – tgdavies

Respuesta

3

SQL Server tiene una estrategia de bloqueo mucho más restrictiva en comparación con PostgreSQL o InnoDB.

Especialmente, bloqueará SELECT en filas (¿tablas?) Que se actualizan desde una conexión/transacción diferente (en la instalación predeterminada).

Debe asegurarse de no seleccionar las mismas filas en una sesión que se están actualizando desde otra.

Si no puede cambiar la secuencia de su código, puede salirse con la suya usando "lecturas sucias" en SQL Server.

Si recuerdo correctamente que, esto se logra mediante la adición de WITH NOLOCK a las instrucciones SELECT (pero no estoy del todo seguro)

Editar
Una posibilidad diferente (si está en SQL Server 2005 o más tarde) sería utilizar el nuevo "aislamiento de instantáneas" para evitar selecciones de bloqueo.

+0

SQL Server también tiene aislamiento de instantáneas. –

+1

@MartinSmith: Lo sé. Es por eso que dije "instalación por defecto". Pero tiene algo que decir: el cambio al aislamiento de instantáneas también podría resolver ese problema. –

+0

No dijo "instalación predeterminada". ¡Tal vez lo pensaste! –