Banco de dados transacional usado para reservar itens ...
Nosso fornecedor foi solicitado a substituir #temptables por @tablevariables (devido a bloqueios pesados de compilação), mas eles foram substituídos por uma tabela real que adiciona o SPID como uma coluna para garantir que o procedimento armazenado atue apenas nas linhas aplicáveis.
Você vê algum risco nesse método de operação? Antes de todas as transações serem isoladas dentro de sua própria transação ... Preocupei-me que possamos acabar bloqueando muito essa tabela, mas a opinião deles é que o SQL usa bloqueio no nível de linha e isso não criará mais bloqueios.
Versão do SQL Server: 2016 Enterprise - 13.0.5216.0
CREATE TABLE dbo.qryTransactions (
ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED,
spid int NOT NULL,
OrderID int,
ItemID int,
TimeTransactionStart datetime,
TimeTransactionEnd datetime,
...other fields
)
CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)
Respostas:
Um pouco mais desmedido do que pode caber em um bloco de comentários ... e deseja destacar um comentário que o OP fez em resposta à resposta de Ray:
Fazendo uma ligeira tangente por um minuto ... o que aconteceria com esse cenário é o Sybase ASE ...
Voltar ao problema do OP (bloqueios de compilação no processo filho) ...
Quanto à idéia de usar uma única tabela permanente com @@ SPID para diferenciar linhas entre sessões ... esteve lá, viu que ... eca ; questões recorrentes:
Eu gostaria de voltar e (re) investigar o problema raiz (bloqueios de recompilação no processo filho) e ver se há uma maneira de reduzir (eliminar?) Os bloqueios de compilação mencionados. [Infelizmente, meu conhecimento do SQL Server sobre esses problemas é ... NULL ... por isso estaria interessado na entrada de alguns especialistas em compiladores do SQL Server.]
fonte
Parece-me que usar algo
@@SPID
assim está pedindo problemas.Os IDs de sessão são reutilizados com freqüência; assim que uma conexão do usuário se desconectar, esse ID da sessão estará disponível para ser usado novamente e provavelmente será usado pela próxima sessão que tentar se conectar.
Para fazê-lo funcionar pelo menos de maneira semi-confiável, você precisaria de um gatilho de logon que limpe as linhas anteriores da tabela com a mesma
@@SPID
. Se você fizer isso, provavelmente verá muitos bloqueios na tabela usando a@@SPID
coluna.O SQL Server realmente usa o bloqueio de linhas, mas também o bloqueio de páginas e o bloqueio de tabelas. Obviamente, você pode mitigar isso por meio de uma boa indexação, mas isso ainda parece um anti-padrão para mim.
Se o procedimento armazenado for o único método usado para acessar as tabelas afetadas, você poderá investigar usando um bloqueio de aplicativo,
sp_getapplock
para essencialmente serializar o acesso às partes relevantes. Os documentos para sp_getapplock estão aqui . Erik Darling tem um post interessante sobre isso aqui .fonte
Sim, eu vejo riscos. É ingênuo contar com o SQL usando o Bloqueio de linhas. Por exemplo, tenho certeza de que inserções e exclusões usarão bloqueios de página pelo menos. O SQL Engine escolhe o tipo de bloqueio com base em vários fatores e nenhum desses fatores inclui "a opinião deles". Soluções gerais, como alterar tabelas temporárias por variáveis de tabela, geralmente também são más idéias. As variáveis de tabela são muito úteis em algumas situações, mas elas têm limitações e problemas de desempenho. Prefiro tabelas temporárias na maioria das circunstâncias. Especialmente quando a tabela conterá mais de algumas dezenas de linhas. Eu exigiria que o fornecedor explicasse por que o sistema experimentou "bloqueios pesados de compilação" e como isso prejudicou o desempenho. Lembre-se, sempre que você olhar, encontrará "bloqueios pesados" de algum tipo. Isso não significa necessariamente que os bloqueios sejam um problema. Max ' Os comentários de s sobre @@ SPID também são importantes. Além disso, o modelo de transação e o processamento de erros podem ser grandes problemas. Se o seu sistema tiver conflitos ou problemas de qualidade de dados de entrada, o processamento de erros padrão poderá resultar no encerramento da sessão sem que a tabela qryTransactions seja redefinida corretamente. OMI, a abordagem da solução errada para o problema original.
fonte