Gerenciamento de transações do Spring Framework

O problema

1. O que é uma transação?

2. Qual é o objetivo da transação?

Transação de banco de dados

O gerenciamento de transações subjacente do Spring é baseado em transações do banco de dados, portanto, antes de aprender as transações do Spring, precisamos primeiro aprender as transações do banco de dados.

Definição de transação

A transação é uma unidade lógica no processo de execução do sistema de gerenciamento de banco de dados, consistindo em uma sequência limitada de operações do banco de dados. (Da Wikipedia)

Uma tradução simples é combinar as operações passo a passo do acesso aos recursos de dados em uma operação inteira, e toda essa unidade de execução é uma transação .

O objetivo da transação

O objetivo da transação é garantir a consistência dos dados.

Características das transações

Para garantir que a operação passo a passo seja combinada em uma operação inteira, em todo o sucesso ou em toda a falha (mesma vida e morte). Precisa haver uma definição estrita.

As quatro características das transações (ACID) : atomicidade (Atomicidade), consistência (Consistência), isolamento (IsoLation), durabilidade (Durabilidade).

  1. Atomicidade: múltiplas operações da mesma transação são unidades mínimas indivisíveis. Quando todas as operações são executadas com sucesso, a transação é enviada, caso contrário, todas as operações bem-sucedidas são canceladas e o banco de dados é restaurado para o estado inicial.
  2. Consistência: após o envio da transação, os resultados dos dados são consistentes com as regras de expectativas de negócios. Por exemplo, não importa se a transação foi enviada com êxito ou não, o total das duas contas permanece inalterado.
  3. Isolamento: há isolamento entre transações e transações durante operações simultâneas e elas não interferem entre si.O isolamento depende do nível de isolamento do banco de dados.
  4. Persistência: Após o envio bem-sucedido da transação, uma série de operações na transação será mantida no banco de dados.

Nível de isolamento da transação

  1. Leitura não confirmada: uma transação pode ler outro conteúdo não confirmado. Pode haver "leitura suja", "leitura não repetível", "leitura fantasma".
  2. Confirmação de leitura: uma transação pode ler apenas o conteúdo de outros dados que foram enviados com êxito. Pode haver "leitura não repetível" e "leitura fantasma". O nível de isolamento padrão para a maioria dos bancos de dados
  3. Leitura repetida: os mesmos dados são lidos várias vezes durante a transação. "Leitura mágica" pode aparecer. Nível padrão do MySQL.
  4. Serialização: todas as operações de transação devem ser executadas em sequência. O nível de isolamento mais rigoroso.

Problemas de simultaneidade de dados

  1. Leitura suja : a transação 1 atualiza os dados, mas não é confirmada, mas a transação 2 pode ler o conteúdo não confirmado. Quando a transação reverte os dados não confirmados, a transação 2 lê antes.
  2. Leitura não repetível : A mesma transação lê os mesmos dados várias vezes e o resultado de cada leitura é diferente. A transação 1 lê os dados antes e depois da operação de atualização da transação 2, e os dois resultados serão diferentes.
  3. Leitura mágica : a mesma transação executa várias consultas no mesmo conjunto de dados e o conjunto de resultados é diferente a cada vez . A transação 1 lê os dados antes e depois da transação 2, inserir ou excluir a operação e o conjunto de resultados da operação é diferente.

Motivo da leitura suja: a operação "select" não é restrita

Motivo da leitura não repetível: a operação "update" não é limitada

Razões para a leitura fantasma: as operações "inserir" e "excluir" não são restritas

O efeito do nível de isolamento da transação em problemas de simultaneidade de dados

  1. Leia a função não confirmada: sem efeito.
  2. Envio de leitura: o uso de "leitura de instantâneo" pode evitar "leitura suja", mas não pode "leitura não repetível" e "leitura fantasma".
  3. Leituras repetidas: use "leituras de instantâneo" para evitar "leituras sujas" e "leituras não repetíveis", mas não "leituras mágicas".
  4. Serialização: pode evitar "leitura suja", "leitura não repetível", "leitura fantasma".

Leitura de instantâneo

A leitura de instantâneo é baseada na implementação do MVCC e desfaz o log, adequado para instruções de seleção simples. O controle de versão simultânea do MVCC é alcançado pelo ReadView (exibição de transação).

A leitura foi enviada: cada SQL na transação gerará um ReadView. O valor no último ReadView será lido durante a operação de consulta.

Leitura repetida: Um ReadView é gerado quando a transação é iniciada. Vários SQL na transação lerão o mesmo ReadView. O valor no mesmo ReadView também será lido em várias consultas SQL.

Gerenciamento de transações Spring

O Spring fornece um modelo de programação unificado para gerenciamento de transações e estabelece uma abstração de transação unificada em alto nível.

Interface de gerenciamento de transações

TransactionDefinition

É usado para descrever os atributos específicos da transação, como o nível de isolamento da transação, o período de tempo limite, se é uma transação de leitura e as regras de propagação da transação.

Nível de isolamento da transação

Em TransactionDefinition, cinco constantes representando o nível de isolamento são definidas:

(1) TransactionDefinition.ISOLATION_DEFAULT, o que significa que o setor de isolamento padrão do banco de dados é usado (o Oracle usa envio de leitura, o Mysql usa leituras repetíveis por padrão)

(2) TransactionDefinition.ISOLATION_READ_UNCOMMITTED, indicando que a leitura não foi enviada.

(3) TransactionDefinition.ISOLATION_READ_COMMITTED, o que significa ler e enviar.

(4) TransactionDefinition.ISOLATION_REPEATABLE_READ, que pode ser lido repetidamente.

(5) TransactionDefinition.ISOLATION_SERIALIZABLE, que significa serialização.

Comportamento de propagação de transação

Quando uma transação é chamada por outra transação, você precisa especificar a propagação da transação.

TransactionDefinition.PROPAGATION_REQUIRED, se houver uma transação no momento, junte-se à transação; se não houver uma transação, crie uma nova transação, essa é a escolha mais comum.

TransactionDefinition.PROPAGATION_SUPPORTS, se houver uma transação no momento, junte-se à transação; se não houver transação, continue executando de maneira não transacional.

TransactionDefinition.PROPAGATION_MANDATORY, se houver uma transação no momento, junte-se à transação; se não houver uma transação no momento, gere uma exceção.

Tempo limite da transação

Excedido o tempo em que a transação pode ser executada, a transação será revertida automaticamente se a transação não for concluída dentro do tempo especificado. A unidade padrão em TransactionDefinition é segundos.

Status somente leitura

A transação lê apenas os recursos da transação e não modifica nenhum dado. Se você ler apenas os dados do recurso da transação, poderá configurá-lo para o estado somente leitura para melhorar o desempenho da execução.

Regras de reversão

Usado para definir as exceções correspondentes para reversão e não sobreposição. Por padrão, as transações são revertidas apenas quando encontram exceções específicas durante o tempo de execução.

TransactionStatus

Usado para indicar o status específico de execução da transação. O gerenciador de transações pode obter as informações de status do tempo de execução da transação por meio dessa interface e também pode reverter a transação indiretamente por essa interface, o que é mais significativo do que reverter a transação quando uma exceção é lançada.

PlatformTransactionManager

Gerenciador de transações, forneça confirmação de transação, recupere e retorne uma transação existente ou crie uma nova transação a partir do ambiente da transação, de acordo com as informações de definição da transação.

<!-- 事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>

Referência

[1] https://zh.wikipedia.org/wiki/Transação de banco de dados

[2] https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc

[3] https://www.cnblogs.com/AlmostWasteTime/p/11466520.html

[4] https://juejin.im/post/5b00c52ef265da0b95276091.

[5] "Dominando o combate ao desenvolvimento de aplicativos corporativos Spring4.x"

Acho que você gosta

Origin www.cnblogs.com/boycelee/p/12688939.html
Recomendado
Clasificación