Cuando ejecuto lo siguiente (en el estudio de administración, GO separará los comandos en lotes)
use tempdb
begin tran
go
CREATE TYPE dbo.IntIntSet AS TABLE(
Value0 Int NOT NULL,
Value1 Int NOT NULL
)
go
declare @myPK dbo.IntIntSet;
go
rollback
Recibo un mensaje de error de punto muerto. Mi proceso se ha estancado consigo mismo. He visto este comportamiento en 2008, 2008R2 y 2012.
¿Hay alguna forma de usar mi tipo recién creado dentro de la misma transacción que se creó?
sql-server
sql-server-2012
sql-server-2008
deadlock
Michael J Swart
fuente
fuente
Respuestas:
Esto se ha informado no menos de cuatro veces. Este se cerró como se solucionó:
http://connect.microsoft.com/SQLServer/feedback/details/365876/
Pero eso no era cierto. (Consulte también la sección de soluciones alternativas; la solución alternativa que sugerí no siempre será aceptable).
Este se cerró como por diseño / no se solucionará:
http://connect.microsoft.com/SQLServer/feedback/details/581193/
Estos dos son más nuevos
y aún activos:http://connect.microsoft.com/SQLServer/feedback/details/800919/ (ahora cerrado como No soluciona )
http://connect.microsoft.com/SQLServer/feedback/details/804365/ (ahora cerrado como Por diseño )
Hasta que Microsoft pueda convencerse de lo contrario, tendrá que encontrar una solución alternativa: simplemente implemente todos los tipos antes de ejecutar su prueba, o divídalo en varias pruebas.
Intentaré obtener la confirmación de mis contactos sobre lo que Umachandar quiso decir con arreglado en el primer elemento, porque obviamente eso entra en conflicto con declaraciones posteriores.
ACTUALIZACIÓN # 1 (de, con suerte, exactamente 2)
El error original (que se cerró como solucionado) involucraba tipos de alias, pero no de tipo
TABLE
. Se informó sobre SQL Server 2005, que obviamente no tenía tipos de tabla y TVP. Parece que UC informó que el error con los tipos de alias que no son de tabla se corrigió en función de cómo manejan las transacciones internas, pero no cubrió un escenario similar que luego se introdujo con los tipos de tabla. Todavía estoy esperando la confirmación de si ese error original debería haberse cerrado alguna vez; He sugerido que los cuatro se cierren como por diseño. Esto se debe en parte a que es más o menos como esperaba que funcionara, y en parte porque UC me da la sensación de que "arreglarlo" para que funcione de una manera diferente es extremadamente complejo, podría romper la compatibilidad con versiones anteriores y sería útil en un Número muy limitado de casos de uso. Nada en contra de usted o su caso de uso, pero fuera de los escenarios de prueba I 'ACTUALIZACIÓN # 2
He blogueado sobre este tema:
http://www.sqlperformance.com/2013/11/t-sql-queries/single-tx-deadlock
fuente
Pude reproducir esto. El gráfico de punto muerto es bastante curioso:
A mí me parece un error y le recomendaría que abra un elemento de conexión para ello.
Para solucionar su problema inmediato, puede usar
tSQLt.NewConnection
(supongo que está usando tSQLt)Todavía no entiendo de dónde viene la necesidad de crear un tipo de tabla sobre la marcha y supongo que estás complicando demasiado tu prueba. Envíame un correo electrónico si quieres discutir.
fuente
A menos que alguien sepa diferente, no creo que haya una manera de hacer esto en una sola transacción. No creo que esto sea un error.
Primero, debe tomar un bloqueo de modificación de esquema (Sch-M) cuando crea el tipo. Como no confirma la transacción, el bloqueo permanece abierto. Luego intenta declarar una variable para ese tipo en la misma transacción. Esto intenta tomar un bloqueo de estabilidad de esquema (Sch-S). Esos dos tipos son incompatibles simultáneamente en el mismo objeto. Dado que están en la misma transacción, SQL lo trata como un punto muerto porque el Sch-S nunca se puede otorgar mientras la transacción está abierta.
Ejecute cada lote de uno en uno y seleccione contra sys.dm_tran_locks tan pronto como intente declarar la variable. Verá el mismo proceso sosteniendo un Sch-M y esperando un Sch-S en el mismo objeto.
fuente