Spring添加聲明式事務


一、前言

Spring提供了聲明式事務處理機制,它基於AOP實現,無須編寫任何事務管理代碼,所有的工作全在配置文件中完成。

二、聲明式事務的XML配置方式

為業務方法配置事務切面,需要用到tx和aop兩個命名空間下的標簽,先在Spring配置文件中導入這兩個命名空間。

1、配置事務管理器組件

事務管理器組件提供對事務處理的全面支持和統一管理,在切面中相當於增強處理的角色。這里使用Spring提供的事務管理器類DataSourceTransactionManager來實現,如下

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

配置DataSourceTransactionManager時,要為其注入事先定義好的數據源組件

2、配置事務增強

通過<tx:advice>標簽配置事務增強,綁定事務管理器並針對不同方法定義事務規則

<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="find*" propagation="SUPPORTS"/>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="del*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

其中transaction-manager屬性引用和一個事務管理器Bean,transaction-manager屬性的默認值是transactionManager,也就是說,如果定義的事務管理器Bean的名稱是transactionManager,則可以不用指定該屬性值

通過<tx:attributes>子標簽定制事務屬性,事務屬性通過<tx:method>標簽進行設置。Spring支持對不同的方法設置不同的事務屬性所以可以為一個<tx:advice>設置多個<tx:method>

<tx:method>標簽中的name屬性是必需的,用於指定匹配的方法。若要對方法名進行約定,可以使用通配符(*)。其他屬性均為可選,用於指定具體的事務規則,如下

暫時省略......

3、配置切面

最后還要定義切面,將事務增強與方法切入點結合,將事務規則應用到指定的方法上

<!-- 定義切面 -->
<aop:config>
    <!-- 定義切入點 -->
    <aop:pointcut id="serviceMethod" expression="execution(* edu.cn.service..*.*(..))"/>
    <!-- 將事務增強與切入點結合 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config> 

aop:advisor的advice-ref屬性引用的是通過<tx:advice>標簽設定了事務屬性的組件

三、聲明式事務的注解添加方式

Spring還支持使用注解配置聲明式事務,所使用的注解是@Transactional。首先仍然需要在Spring配置文件中配置事務管理器,並添加對注解配置的事務的支持,如下

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>

經過上述配置,程序便支持使用@Transactional注解來配置事務了 

import org.springframework.transaction.annotation.Transaction
import org.springframework.stereotype.Service;

@Transaction
@Service("userService")
public class UserServiceImpl implements UserService{
    @Autowired
    private UserMapper userMapper;

    @Override
    @Transaction(propagation = Propagation.SUPPORTS)
    public List<User> findUsersWithConditions(User user){
        //省略
    }

    @Override
    public boolean addNewUser(User user){
        //省略
    }
}

在業務類上添加@Transactional注解即可為該類的所有業務方法統一添加事務處理。如果某一業務方法需要采用不同的事務規則,可以在該業務方法上添加@Transactional注解進行單獨設置。

@Transactional注解也可以設置事務屬性的值,默認的@Transactional設置如下

暫時省略......

這些默認值當然也是可以改變的,如下

暫時省略......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM