14
2020
11

请描述一下Spring的事务?

声明式事务管理的定义:用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可,这样维护起来极其方便。

 

基于TransactionInterceptor的声明式事务管理:两个次要的属性:transactionManager,用来指定一个事务治理器,并将具体事务相关的操作请托给它;其他一个是Properties类型的transactionAttributes属性,该属性的每一个键值对中,键指定的是方法名,方法名可以行使通配符,而值就是表现呼应方法的所运用的事务属性。

 

<beans>

    ......

    <bean id="transactionInterceptor"

          class="org.springframework.transaction.interceptor.TransactionInterceptor">

        <property name="transactionManager" ref="transactionManager"/>

        <property name="transactionAttributes">

            <props>

                <prop key="transfer">PROPAGATION_REQUIRED</prop>

            </props>

        </property>

    </bean>

    <bean id="bankServiceTarget"

          class="footmark.spring.core.tx.declare.origin.BankServiceImpl">

        <property name="bankDao" ref="bankDao"/>

    </bean>

    <bean id="bankService"

          class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="target" ref="bankServiceTarget"/>

        <property name="interceptorNames">

            <list>

                <idref bean="transactionInterceptor"/>

            </list>

        </property>

    </bean>

</beans>

 

基于 TransactionProxyFactoryBean 的声明式事务管理:设置配置文件与先前比照简化了许多。我们把这类设置配置文件格式称为 Spring 经典的声明式事务治理。 

 

<beans>

    ......

    <bean id="bankServiceTarget"

          class="footmark.spring.core.tx.declare.classic.BankServiceImpl">

        <property name="bankDao" ref="bankDao"/>

    </bean>

    <bean id="bankService"

          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

        <property name="target" ref="bankServiceTarget"/>

        <property name="transactionManager" ref="transactionManager"/>

        <property name="transactionAttributes">

            <props>

                <prop key="transfer">PROPAGATION_REQUIRED</prop>

            </props>

        </property>

    </bean>

</beans>

 

基于  <tx>   命名空间的声明式事务治理:在前两种方法的基础上,Spring 2.x  引入了  <tx>  命名空间, 连络行使 <aop> 命名空间,带给开发人员设置配备声明式事务的全新体验。

 

<beans>

    ......

    <bean id="bankService"

          class="footmark.spring.core.tx.declare.namespace.BankServiceImpl">

        <property name="bankDao" ref="bankDao"/>

    </bean>

    <tx:advice id="bankAdvice" transaction-manager="transactionManager">

        <tx:attributes>

            <tx:method name="transfer" propagation="REQUIRED"/>

        </tx:attributes>

    </tx:advice>

    <aop:config>

        <aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/>

        <aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>

    </aop:config>

    ......

</beans>

 

基于  @Transactional  的声明式事务管理:Spring  2.x  还引入了基于  Annotation  的体式格式,具体次要触及@Transactional   标注。@Transactional   可以浸染于接口、接口方法、类和类方法上。算作用于类上时,该类的一切public 方法将都具有该类型的事务属性。

 

@Transactional(propagation = Propagation.REQUIRED)

public boolean transfer(Long fromId, Long toId, double amount) {

    return bankDao.transfer(fromId, toId, amount);

}

 

编程式事务管理的定义:在代码中显式挪用 beginTransaction()、commit()、rollback()等事务治理相关的方法, 这就是编程式事务管理。Spring 对事物的编程式管理有基于底层 API 的编程式管理和基于 TransactionTemplate 的编程式事务管理两种方式。

 

基于底层 API 的编程式管理:凭证 PlatformTransactionManager 、 TransactionDefinition 和TransactionStatus 三个焦点接口,来实现编程式事务管理。

 

public class BankServiceImpl implements BankService {

    private BanckDao bankDao;

    private TransactionDefinition txDefinition;

    private PlatformTransactionManager txManager;


    public boolean transfer(Long fromId, Long toId, double amount) {

        TransactionStatus txStatus = txManager.getTransaction(txDefinition);

        boolean result = false;

        try {

            result = bankDao.transfer(fromId, toId, amount);

            txManager.commit(txStatus);

        } catch (Exception e) {

            result = false;

            txManager.rollback(txStatus);

            System.out.println("Transfer Error!");

        }

        return result;

    }

}

 

基于 TransactionTemplate  的编程式事务管理:为了不损坏代码原有的条理性,避免出现每一个方法中都包括相同的启动事物、提交、回滚事物样板代码的现象,spring 提供了 transactionTemplate 模板来实现编程式事务管理。

 

public class BankServiceImpl implements BankService {

    private BankDao bankDao;

    private TransactionTemplate transactionTemplate;


    public boolean transfer(final Long fromId, final Long toId, final double amount) {

        return (Boolean) transactionTemplate.execute(new TransactionCallback() {

            public Object doInTransaction(TransactionStatus status) {

                Object result;

                try {

                    result = bankDao.transfer(fromId, toId, amount);

                } catch (Exception e) {

                    status.setRollbackOnly();

                    result = false;

                    System.out.println("Transfer Error!");

                }

                return result;

            }

        });

    }

}

 

编程式事务与声明式事务的区别:

 

编程式事务是自己写事务处理的类,然后调用。

 

声明式事务是在配置文件中配置,一般搭配在框架里面使用。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。