Maison  >  Article  >  base de données  >  Introduction détaillée aux transactions SpringBoot

Introduction détaillée aux transactions SpringBoot

王林
王林avant
2019-08-22 18:02:233052parcourir

Concepts importants

Mode de validation automatique

Pour la base de données MySQL, par défaut, la base de données est en mode de validation automatique. Chaque instruction se trouve dans une transaction distincte. Lorsque l'instruction est exécutée, la transaction est implicitement validée si l'exécution réussit, et la transaction est implicitement annulée si l'exécution échoue. Pour une gestion normale des transactions, un groupe d'opérations liées sont dans une seule transaction, le mode de soumission automatique de la base de données doit donc être désactivé. Voici comment le visualiser :

Vérifiez si la commande est automatiquement soumise (ON). signifie que la soumission automatique est activée, la valeur est 1, OFF signifie désactiver la soumission automatique, la valeur est 0) :

show variables like 'autocommit';

Après avoir désactivé la soumission automatique, l'utilisateur sera toujours dans une transaction et le courant La transaction ne se terminera pas tant qu'une instruction de validation ou d'annulation ne sera pas exécutée. Recommencez une nouvelle transaction.

DataSource connection = masterDataSource.getConnection();
connection.setAutoCommit(false);

Niveau d'isolement des transactions

Le niveau d'isolement fait référence au degré d'isolement entre plusieurs transactions simultanées. L'interface TransactionDefinition définit cinq constantes indiquant les niveaux d'isolement :

1, TransactionDefinition.ISOLATION_DEFAULT : Il s'agit de la valeur par défaut, indiquant que le niveau d'isolement par défaut de la base de données sous-jacente est utilisé. Pour la plupart des bases de données, cette valeur est généralement TransactionDefinition.ISOLATION_READ_COMMITTED.

2, TransactionDefinition.ISOLATION_READ_UNCOMMITTED : Ce niveau d'isolement signifie qu'une transaction peut lire des données modifiées par une autre transaction mais pas encore validées. Ce niveau n’empêche pas les lectures incorrectes, les lectures non répétables et les lectures fantômes ; ce niveau d’isolement est donc rarement utilisé. Par exemple, PostgreSQL n'a pas ce niveau.

3. TransactionDefinition.ISOLATION_READ_COMMITTED : Ce niveau d'isolement signifie qu'une transaction ne peut lire que les données qui ont été soumises par une autre transaction. Ce niveau évite les lectures incorrectes et constitue la valeur recommandée dans la plupart des cas.

4. TransactionDefinition.ISOLATION_REPEATABLE_READ : Ce niveau d'isolement signifie qu'une transaction peut exécuter une requête de manière répétée plusieurs fois pendant tout le processus, et les enregistrements renvoyés à chaque fois sont les mêmes. Ce niveau empêche les lectures sales et les lectures non répétables.

5, TransactionDefinition.ISOLATION_SERIALIZABLE : Toutes les transactions sont exécutées une par une dans l'ordre, de sorte qu'il n'y a aucune possibilité d'interférence entre les transactions. En d'autres termes, ce niveau peut empêcher les lectures sales, les lectures non répétables et les lectures fantômes. lit. Mais cela affectera sérieusement les performances du programme. Normalement, ce niveau n'est pas utilisé.

Comportement de propagation des transactions

Le comportement dit de propagation des transactions signifie que si un contexte de transaction existe déjà avant de démarrer la transaction en cours, il existe plusieurs options pour spécifier un comportement d'exécution des méthodes transactionnelles. La définition TransactionDefinition comprend les constantes suivantes représentant le comportement de propagation :

1, TransactionDefinition.PROPAGATION_REQUIRED : Si une transaction existe actuellement, rejoignez la transaction. S'il n'y a actuellement aucune transaction, créez une nouvelle transaction. Il s'agit de la valeur par défaut.

2. TransactionDefinition.PROPAGATION_REQUIRES_NEW : Créez une nouvelle transaction si une transaction existe actuellement, suspendez la transaction en cours.

3. TransactionDefinition.PROPAGATION_SUPPORTS : S'il y a actuellement une transaction, rejoignez la transaction ; s'il n'y a actuellement aucune transaction, continuez à l'exécuter de manière non transactionnelle.

4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED : Exécuter en mode non transactionnel Si une transaction existe actuellement, la transaction en cours sera suspendue.

5, TransactionDefinition.PROPAGATION_NEVER : Exécuté en mode non transactionnel. Si une transaction existe actuellement, une exception sera levée.

6, TransactionDefinition.PROPAGATION_MANDATORY : S'il y a actuellement une transaction, rejoignez la transaction ; s'il n'y a actuellement aucune transaction, lancez une exception.

7, TransactionDefinition.PROPAGATION_NESTED : S'il y a actuellement une transaction, créez une transaction à exécuter comme une transaction imbriquée de la transaction en cours ; s'il n'y a actuellement aucune transaction, cette valeur est équivalente à TransactionDefinition.PROPAGATION_REQUIRED.

Point de protection (Savepoints)

Tout d'abord, vous devez savoir que le point de sauvegarde est destiné à la restauration. Il n'y a pas de limite sur le nombre de points de sauvegarde. similaire aux instantanés dans les machines virtuelles. Un point de sauvegarde est un point dans une transaction. Utilisé pour annuler une partie de la transaction. Une fois la transaction terminée, tous les points de sauvegarde définis dans la transaction seront automatiquement supprimés.

Lors de l'exécution d'une restauration, vous pouvez revenir au point spécifié en spécifiant un point de sauvegarde.

Plusieurs opérations importantes pour annuler une transaction

1. Définir le point de sauvegarde a

2 Après avoir annulé le point de sauvegarde a, la transaction est annulée vers un

3. . Annulez toute annulation de transaction

Remarque : cette transaction d'annulation doit être utilisée avant la validation

public class UserRepository {
 
	
	private DataSource masterDataSource;
	private Connection connection = null;
	@Autowired
	public void setMasterDataSource(DataSource masterDataSource) {
		this.masterDataSource = masterDataSource;
	}
 
 
	@Transactional
	public boolean save(User user) {
		try {
			connection = masterDataSource.getConnection();
			connection.setAutoCommit(false);
			//设置保护点
			Savepoint saveUser = connection.setSavepoint("saveUser");
			PreparedStatement prepareStatement = connection.prepareStatement("insert into user(id,name,age) values(?,?,?)");
			prepareStatement.setLong(1, user.getId());
			prepareStatement.setString(2, user.getName());
			prepareStatement.setInt(3, user.getAge());
			prepareStatement.execute();
		
			try {
				update(user);
			} catch (Exception e) {
				System.out.println("出错了。。"+e);
				//回滚至保护点
				connection.rollback(saveUser);
			}
			connection.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return true;
	}
	
	public boolean update(User user) {
		System.out.println("save user:"+user);
		
		try {
			PreparedStatement prepareStatement = connection.prepareStatement("update user set name = ? ,age = ? where id = ?)");
			prepareStatement.setLong(3, user.getId());
			prepareStatement.setString(1, "王大拿");
			prepareStatement.setInt(2, 100/0);
			prepareStatement.execute();
			
			connection.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return true;
	}
}

Veuillez me corriger s'il y a des erreurs dans le contenu ci-dessus, merci ; !

Pour plus de questions liées à Mysql, veuillez visiter le site Web PHP chinois : Tutoriel vidéo MySQL

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer