Configuração do Controle de Transações
Como padrão do servidor do banco de dados, ao se criar um novo banco de dados, o padrão do SQL Server é que o Lock em um simples select, enquanto que em outra transação não consegue acessar o dados até a transação que requisição inicial (select) seja liberada pelo servidor/cliente. Nas próximas versões do sistema o banco de dados será criado com o comando (descrito abaixo) e não há a necessidade de execução desse comando.
Para exemplificar os problemas que podem ocorrer com a abordagem, veja abaixo.
1 Imagine uma tabela de nome Entidade com cinco registros e duas transações... e uma delas está no processo de atualização e inserção de uma nova entidade. Antes de a transação concluir, outro usuário acessa a entidade através de Select.
Para simular, inicie um debug em uma aba do SQL Server Management Studio e pare em Insert. Depois entre abra uma nova aba e execute o comando da transação 2.
Transação 1
Begin transaction
begin transaction
update Entidade Set NomeFantasia = 'Alterado 123' where ID =1
commit
Insert Into Entidade (Id,NomeFantasia) values (70, 'Test')
update Entidade Set NomeFantasia = 'Outra alteração' where ID = 2
commit
Transação 2
Select * From Entidade -- (Isso deve bloquear (lock) até que a atualização da transação 1 for resolvido )
A segunda transação irá trazer todos os registros do banco de dados, mas somente quando a primeira transação for finalizada e isso causa lentidão e diversos outros problemas de performance no banco. Para poder resolver isso, pode-se usar HINT with(lock) como alguns softwares fazem; mas há uma outra forma usando um comando de configuração do próprio banco, alterando o ISOLATION LEVEL definindo no banco de dados.
Para realização desse comando, faz-se necessário que somente um usuário esteja conectado: o usuário da transação corrente. Para saber se existem mais usuários, use a procedure seguinte (esse comando retorna todos os usuários conectados no servidor).
exec sp_who
Depois execute o seguinte para alterar as configurações do snapshot.
ALTER DATABASE [NomeDoBancoDeDados] SET READ_COMMITTED_SNAPSHOT ON;
Caso o SQL Server esteja demorando muito para executar esse comando, verifique se seu SAP está aberto - caso esteja, feche-o para que o banco de dados possa executar o comando mais rápido. |
Depois disso, realize o mesmo procedimento da executado em Transação 1 e Transação 2 e veja se o SQL Server não irá bloquear o resultado do comando Transação 2.
Esse procedimento é aconselhado para todos os bancos de dados que existem no servidor. Essa configuração ativa o modo ROW VERSION no controle de transações, que é comum em outros servidores de banco de dados.
Para saber qual o nível que está configurado, execute o seguinte comando.
SELECT is_read_committed_snapshot_on,* FROM sys.databases WHERE name= 'NomeDoBancoDeados'
O resultado mostra as configurações do banco e uma das linhas mostram o ISOLATION LEVEL do banco de dados.
| Foi retirado a obrigatoriedade de habilitar o controle de transações, será exibida a mensagem abaixo, será um “Aviso“, ou seja, não impedirá que o add-on seja iniciado. "O banco de dados está com uma configuração não apropriada, recomendamos alterar a configuração de transações (READ_COMMITTED_SNAPSHOT), para não haver lentidão e gerar deadlocks no SAP B1" |