Spring宣告式事務控制

cuixiaoming1994發表於2018-03-27

程式設計式事務相關的API

1、PlatformTransactionManager:平臺事務管理器 介面
作用:封裝事務控制的邏輯
dao層實現技術很多:

  • jdbc/DBUtils/JdbcTemplate: 事務控制 connection.setAutoCommit(false);
  • hibernate: 事務控制 session.beginTransaction();

    發現 dao 實現技術不同 導致控制事務的方式也不同
    封裝控制事務的程式碼也不同

  • jdbc/DBUtils/JdbcTemplate:使用平臺事務管理器 是 DataSourceTransactionManager
    hibernate: 使用平臺事務管理器 是 HibernateTransactionManager

2、TransactionDifination:事務定義管理器
作用:封裝事務的相關引數 封裝的是靜態資訊

隔離級別 isolation
傳播行為 propogation
    作用:為解決業務方法呼叫業務方法問題(事務巢狀事務問題)

超時時間 timer
是否只讀 read-only

3、TransactionStatus : 事物的狀態物件
作用:在不通過的時間點上 封裝當前事務的一些狀態資訊
TransactionStatus封裝該事務的動態資訊的

使用xml配置

宣告式事務控制主要是配置XML,我們只看事務控制相關的部分


    <!--1.配置事務管理平臺 注入配好了連線資訊的連線池-->
    <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--2.配置事物的通知
        配置平臺事務管理器(封裝的是事務控制的邏輯)中的事務定義管理器
        tx:attributes標籤就是用來配置事務定義管理器(事務的靜態資訊),比如隔離級別,傳播行為等,不配置就為預設
    -->
    <tx:advice id="txAdvice" transaction-manager="TransactionManager">
        <tx:attributes>
            <!-- 每個被事務增強的方法(切點)都可以單獨進行引數的設定
            而且method中可以使用萬用字元,指定以XXX開頭等等 -->
            <!-- <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
            <tx:method name="save*" isolation="READ_COMMITTED" propagation="REQUIRED" read-only="false"/>
            <tx:method name="query*" isolation="READ_COMMITTED" propagation="SUPPORTS" read-only="true"/> -->
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

    <!--3.切點和通知的結合 配置織入-->
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.cuixiaoming.service.impl.*.*(..))"></aop:advisor>
    </aop:config>

使用基本註解

配置XML


    <!--1.配置事務管理平臺-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>


    <!--2.掃描包-->
    <context:component-scan base-package="com.cuixiaoming"></context:component-scan>

    <!--3.事物的註解驅動-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

需要進行事務控制的bean配置起來非常簡單,只需要加上@Transactional 即可,載入方法上是這個方法進行事務控制,載入類上是所有方法都進行事務控制;

package com.cuixiaoming.service.impl;

import com.cuixiaoming.dao.AccountDao;
import com.cuixiaoming.domain.Account;
import com.cuixiaoming.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("accountService")
@Transactional
public class AccountServiceImplAnno implements AccountService {

    @Autowired
    private AccountDao accountDao;

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    @Override
    public void transfer(String outman,String inman ,double money) {
        accountDao.in(new Account(inman,money));
        //int i=1/0;
        accountDao.out(new Account(outman,money));
    }

}

全註解


全註解和半註解形式差不錯,只是把配置XML程式設計了配置類,回頭再補

相關文章