100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > SpringBoot (15)---事务处理

SpringBoot (15)---事务处理

时间:2019-08-26 03:19:12

相关推荐

SpringBoot (15)---事务处理

SpringBoot 中的事务处理

前两章节主要讲解了在SpringBoot中关于对数据的操作,本章节将介绍如何进行事务处理。所有的数据访问技术都离不开事务处理,否则将会造成数据不一致。事务是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态,避免出现由于数据不一致而导致的接下来一系列的错误。事务的出现是为了确保数据的完整性和一致性,在目前企业级应用开发中,事务管理是必不可少的。

1、SpringBoot事务机制

事务处理机制都会提供API来开启事务、提交事务来完成数据操作,或者在发生错误的时候回滚数据,避免数据的不完整性、不一致性。

SpringBoot事务机制实质上就是Spring的事务机制,是采用统一的机制处理来自不同数据访问技术的事务处理,提供了一个接口PlatformTransactionManager,已经为不同数据访问技术可以进行不同的实现,如下表。

涉及到接口关系如下:

接口PlatformTransactionManager源码如下:

/*

* Copyright 2002- the original author or authors.

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* /licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

package org.springframework.transaction;

import org.springframework.lang.Nullable;

/**

* This is the central interface in Spring's transaction infrastructure.

* Applications can use this directly, but it is not primarily meant as API:

* Typically, applications will work with either TransactionTemplate or

* declarative transaction demarcation through AOP.

*

* <p>For implementors, it is recommended to derive from the provided

* {@link org.springframework.transaction.support.AbstractPlatformTransactionManager}

* class, which pre-implements the defined propagation behavior and takes care

* of transaction synchronization handling. Subclasses have to implement

* template methods for specific states of the underlying transaction,

* for example: begin, suspend, resume, commit.

*

* <p>The default implementations of this strategy interface are

* {@link org.springframework.transaction.jta.JtaTransactionManager} and

* {@link org.springframework.jdbc.datasource.DataSourceTransactionManager},

* which can serve as an implementation guide for other transaction strategies.

*

* @author Rod Johnson

* @author Juergen Hoeller

* @since 16.05.

* @see org.springframework.transaction.support.TransactionTemplate

* @see org.springframework.transaction.interceptor.TransactionInterceptor

* @see org.springframework.transaction.interceptor.TransactionProxyFactoryBean

*/

public interface PlatformTransactionManager {

/**

* Return a currently active transaction or create a new one, according to

* the specified propagation behavior.

* <p>Note that parameters like isolation level or timeout will only be applied

* to new transactions, and thus be ignored when participating in active ones.

* <p>Furthermore, not all transaction definition settings will be supported

* by every transaction manager: A proper transaction manager implementation

* should throw an exception when unsupported settings are encountered.

* <p>An exception to the above rule is the read-only flag, which should be

* ignored if no explicit read-only mode is supported. Essentially, the

* read-only flag is just a hint for potential optimization.

* @param definition TransactionDefinition instance (can be {@code null} for defaults),

* describing propagation behavior, isolation level, timeout etc.

* @return transaction status object representing the new or current transaction

* @throws TransactionException in case of lookup, creation, or system errors

* @throws IllegalTransactionStateException if the given transaction definition

* cannot be executed (for example, if a currently active transaction is in

* conflict with the specified propagation behavior)

* @see TransactionDefinition#getPropagationBehavior

* @see TransactionDefinition#getIsolationLevel

* @see TransactionDefinition#getTimeout

* @see TransactionDefinition#isReadOnly

*/

TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;

/**

* Commit the given transaction, with regard to its status. If the transaction

* has been marked rollback-only programmatically, perform a rollback.

* <p>If the transaction wasn't a new one, omit the commit for proper

* participation in the surrounding transaction. If a previous transaction

* has been suspended to be able to create a new one, resume the previous

* transaction after committing the new one.

* <p>Note that when the commit call completes, no matter if normally or

* throwing an exception, the transaction must be fully completed and

* cleaned up. No rollback call should be expected in such a case.

* <p>If this method throws an exception other than a TransactionException,

* then some before-commit error caused the commit attempt to fail. For

* example, an O/R Mapping tool might have tried to flush changes to the

* database right before commit, with the resulting DataAccessException

* causing the transaction to fail. The original exception will be

* propagated to the caller of this commit method in such a case.

* @param status object returned by the {@code getTransaction} method

* @throws UnexpectedRollbackException in case of an unexpected rollback

* that the transaction coordinator initiated

* @throws HeuristicCompletionException in case of a transaction failure

* caused by a heuristic decision on the side of the transaction coordinator

* @throws TransactionSystemException in case of commit or system errors

* (typically caused by fundamental resource failures)

* @throws IllegalTransactionStateException if the given transaction

* is already completed (that is, committed or rolled back)

* @see TransactionStatus#setRollbackOnly

*/

void commit(TransactionStatus status) throws TransactionException;

/**

* Perform a rollback of the given transaction.

* <p>If the transaction wasn't a new one, just set it rollback-only for proper

* participation in the surrounding transaction. If a previous transaction

* has been suspended to be able to create a new one, resume the previous

* transaction after rolling back the new one.

* <p><b>Do not call rollback on a transaction if commit threw an exception.</b>

* The transaction will already have been completed and cleaned up when commit

* returns, even in case of a commit exception. Consequently, a rollback call

* after commit failure will lead to an IllegalTransactionStateException.

* @param status object returned by the {@code getTransaction} method

* @throws TransactionSystemException in case of rollback or system errors

* (typically caused by fundamental resource failures)

* @throws IllegalTransactionStateException if the given transaction

* is already completed (that is, committed or rolled back)

*/

void rollback(TransactionStatus status) throws TransactionException;

}

2、声明式事务

建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

Spring支持声明式事务,被注解的方法在被调用时,Spring开启一个新的事务,当方法无异常结束后,Spring会提交这个事务。

@Transactional

public void insertUser(User user) {

//数据库表的操作

……

}

注:

(1)@Transactional是来自org.springframework.transaction.annotation包的。

(2)@Transactional不仅可以注解在方法上,也可以注解在类上。当注解在类上时,意味着此类的所有public方法都是开启事务的。如果类级别和方法级别同时使用了@Transactional注解,则使用在类级别的注解会重载方法级别的注解。

以下为注解@Transactional源码:

(为了缩小所占篇数,故去掉注释部分)

package org.springframework.transaction.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

import org.springframework.transaction.TransactionDefinition;

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented

public @interface Transactional {

@AliasFor("transactionManager")

String value() default "";

@AliasFor("value")

String transactionManager() default "";

Propagation propagation() default Propagation.REQUIRED;

Isolation isolation() default Isolation.DEFAULT;

int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

boolean readOnly() default false;

Class<? extends Throwable>[] rollbackFor() default {};

String[] rollbackForClassName() default {};

Class<? extends Throwable>[] noRollbackFor() default {};

String[] noRollbackForClassName() default {};

}

属性说明如下表:

在SpringBoot中,建议采用注解@Transactional进行事务的控制。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。