SQL Server: Problema de transação Instantâneo com sinônimos em Express Edition
-
03-07-2019 - |
Pergunta
Temos 2 bancos de dados, diga DB1 e DB2.
DB1 contém todos os procedimentos armazenados cujo acesso também dados em DB2.
usos DB1 sinônimos para acessar as tabelas no DB2.
(Usando sinônimos é uma exigência na nossa situação)
Isso funciona perfeitamente bem em todas as situações com o SQL Server 2005 Developer Edition.
No entanto, no Express Edition, que receber uma exceção quando fazemos o seguinte:
1 Reinicie o SQL Server
2 Execute o seguinte código dentro DB1:
definir nível de isolamento de transação de instantâneo
começar a transação
varchar declarar @sQuery (max)
conjunto @sQuery = 'Select * from synToSomeTableInDB2'
exec (@sQuery)
confirmar a transação
Isto irá resultar no seguinte erro:
Snapshot transação de isolamento falhou no banco de dados '...' porque o banco de dados não foi recuperado quando a transação atual foi iniciado. Repita a operação depois que o banco de dados recuperado.
A mesma consulta seleção passa bem quando usado sem o EXEC ou quando executado no Developer Edition.
Reiniciar o servidor no passo 1 é importante, uma vez que uma ligação foi feita para o DB2, o código é executado também bem no SQL Server Express Edition.
Alguém tem uma idéia do que é isso? Precisamos ser capazes de usar EXEC para algumas consultas dinâmicas. Nós já verificado MSDN, procurou Google, ... Qualquer ajuda é muito apreciada.
--- Editar: 10 09 de março
Como discutido com Ed Harper abaixo, eu já entrou com um relatório de bug para isso.
Consulte https://connect.microsoft.com/SQLServer/feedback/ViewFeedback aspx? FeedbackID = 422150
Solução
Como descobri via Microsoft Connect , o problema é que por padrão no SQL Server Express Edition de AUTO_CLOSE opção é definida em true .
Alterar esta opção para false corrige o problema.
Outras dicas
A mensagem de erro sugere que a consulta falha porque o servidor SQL ainda está se recuperando o banco de dados após a reinicialização do serviço quando você executar a consulta.
Será que o erro ocorre sempre na primeira tentativa de executar esse código, independentemente do tempo decorrido desde que o serviço foi reiniciado?
Pode confirmar partir do registo de SQL Server que o banco de dados está se recuperando corretamente após a reinicialização?