A principal pesquisa deste artigo é a introdução e exemplos do nível de isolamento de transações de primavera, como segue.
Quando duas transações operam em registros no mesmo banco de dados, qual é o impacto entre eles? Isso traz à tona o conceito de nível de isolamento de transações. O isolamento do banco de dados tem muito a ver com o controle de simultaneidade. O nível de isolamento do banco de dados faz parte do ácido da característica transacional do banco de dados. Ácido, isto é, atomicidade, consistência, isolamento e durabilidade. A primavera possui quatro níveis de isolamento da transação: READ_UNCOMMITTED , READ_COMMITTED , REPEATABLE_READ e SERIALIZABLE . Outro é o nível de isolamento padrão do DEFAULT do banco de dados e os padrões do MySQL para REPEATABLE_READ .
Vamos dar uma olhada em detalhes abaixo.
Como o nome indica, READ_UNCOMMITTED significa que uma transação pode ler registros de transações que outra transação não foi cometida. Em outras palavras, uma transação pode ler os dados que ainda não são comprometidos por outras transações. Este é o nível de isolamento mais fraco para as transações de primavera. Veja a figura abaixo, a transação A é ativada e um registro é escrito. Neste momento, a transação B lê os dados e lê esse registro, mas a transação A Rolls de volta. Portanto, os dados lidos pela transação B não são válidos (o banco de dados está em um estado inválido). Esta situação é chamada de leitura suja. Além do problema de leitura suja, READ_UNCOMMITTED também pode ter non-repeatable read (não leitura repetitiva) e phantom read (Phantom Reading).
O nível de isolamento READ_COMMITTED indica que uma transação pode ler apenas os registros comprometidos e não pode ler os registros não comprometidos. Em outras palavras, uma transação só pode ler os dados comprometidos e não pode ler os dados não comprometidos. Portanto, a situação de leitura suja não acontece mais, mas outros problemas podem ocorrer. Veja a foto abaixo.
Entre as duas leituras da transação A, a transação B modifica esse registro e a comete. Portanto, os registros lidos antes e depois da transação A são inconsistentes. Esse problema é chamado de leitura não repetível (não pode ser lida repetidamente). (Os registros lidos inconsistentemente entre as duas vezes, e leituras repetidas encontrarão problemas.)
Além do problema de leitura não repetível, READ_COMMITTED também pode ter um problema de leitura Phantom.
Repetable_read significa que uma transação pode ler um registro do banco de dados várias vezes, e o registro lidas várias vezes é o mesmo, o mesmo. Esse nível de isolamento pode evitar o problema da leitura suja e da leitura não repetível, mas o problema da leitura fantasma pode ocorrer. Como mostrado na figura abaixo.
A transação A lê uma série de registros do banco de dados duas vezes, durante o qual a transação B insere um registro e o envia. Quando a transação A lê a segunda vez, o registro que a transação B acabou de ser inserida será lida. Durante uma transação, uma série de registros lidos por transação a duas vezes é inconsistente, e esse problema é chamado Phantom Read.
Serializável é o nível de isolamento mais forte da primavera. Quando uma transação é executada, ela será bloqueada em todos os níveis, como quando lida e grava, como se a transação fosse realizada de maneira serial, em vez de acontecer juntos. Isso evita leitura suja, leitura não repetível e leitura fantasma, mas causará degradação do desempenho.
MySQL padrão para REPEATABLE_READ .
Vejamos um exemplo abaixo. Abra uma transação no banco de dados MySQL e não se comprometa. Então outra transação lê o registro.
No início, os registros no banco de dados são os mostrados na figura
Em seguida, abra a transação A no banco de dados MySQL e insira um registro.
O atributo de transação da classe de serviço no serviço é configurado como READ_UNCOMMITTED .
@Transactional (isolation = isolation.read_uncommitd) public class Class AccountService {private AccountDao AccountDao; public AccountDao GetAccountDao () {Return AccountDao;} public void SetAccountDao (conta de conta) {this.AccountO para = {AccountDao.outMoney (de, dinheiro); AccountDao.inMoney (para, dinheiro);} public void readallUser () {list <ccount> Accouts = AccountDao.getAllUser (); para (conta: conta: conta) {System.out.println (conta);}}Execute a seguinte aula de teste
pacote com.chris.service; importar org.junit.assert. org.springframework.test.context.junit4.springjunit4classrunner; @runwith (springjunit4classrunner.class) @ContextConfiguration ("ClassPath: ApplicationContext.xml) Classe ReadellUsertest {@Autired {AccountService.readallUser ();}}Os resultados são os seguintes:
Pode -se observar que essa transação lê dados não comprometidos.
Neste momento, reverte a transação aberta no MySQL.
MySQL> reversão;
Execute o programa novamente e o resultado é
Conta [Nome = Michael, Money = 1000.0]
Conta [Nome = Jane, Money = 1000.0]
Conta [Nome = Kate, Money = 1000.0]
O exposto acima é todo o conteúdo deste artigo sobre a introdução ao nível de isolamento da transação de primavera e a análise de exemplos. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!