Spring管理事務

PlatformTransactionManager 幫助我們管理任意平臺的事務。

Jdbc             DataSourceTransactionManager

Hibernate HibernateTransactionManager

……               ……TransactionManager

 

事務:(4大特性)

       (1).一致性       (2).原子性

       (3).持久性       (4).隔離性

事務安全:

事務線程安全:髒讀      不可重複讀    幻讀     讀未提交

隔離級別: 2  4(讀已提交8

 

所有事務的操作有三步:

       開啓事務

       提交事務

       回滾事務

Spring管理事務 利用的是spring aop思維,將事務的操作織入到目標對象中。

Spring管理事務的屬性:

       隔離級別  是否只讀       事物的傳播行爲(7種)


Spring管理事務的三種方式

(1)、代碼式

       1、配置事務管理對象

       2、配置事務管理的模板

       3、在service中注入模板對象,然後調用execute方法。

package cn.hd.spring_transaction.impl;


import cn.hd.spring_transaction.UserDao;
import cn.hd.spring_transaction.UserService;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import javax.annotation.Resource;

public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    @Resource(name ="transactionTemplate")
    private TransactionTemplate tt;

    public void setTt(TransactionTemplatett) {
        this.tt = tt;
    }

    @Override
    public void transform(Integer form,Integer to, Integer money) {
           
/*TransactionCallbackWithoutResult()沒有任何返回值的回調函數*/
           
tt.execute(newTransactionCallbackWithoutResult() {
                @Override
                protected voiddoInTransactionWithoutResult(TransactionStatus transactionStatus) {
                   userDao.increase(to,money);
                    int i = 1/0;
                   userDao.decrease(form,money);
                }
            });
    }
}

 

(2)、xml配置

1、有一個事務管理對象

<bean name="transactionManager"

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

2、配置事務的通知

標籤名 tx:advice   id給當前的事務起個標記     

Transact….. 配置剛剛的事務管理對象

配置參數:method  name  可以是具體某個方法(方法名)    比較麻煩,可以使用通配符的方式去配置

add* delete* update* get*    persist* remove* modify* find*

 要求:你的service的命名必須規範。

isolation:隔離級別使用默認即可(4)default

propagation: 事務傳播行爲 required

read-only:是否只讀 如果查找 true      否則爲false

<!--配置事務通知-->

<tx:advice id="myAdvice" transaction-manager="transactionManager">
    <!--事務的屬性-->
    <tx:attributes>
        <!--給那個方法添加事務;隔離:默認(級別4);傳播行爲:如果事物存在運行,不存在新建;是否只讀-->
        <tx:methodname="transform" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:method name="get*"isolation="DEFAULT" propagation="REQUIRED"read-only="true"/>
        <tx:methodname="add*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:methodname="update*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:methodname="delete*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:methodname="find*" isolation="DEFAULT"propagation="REQUIRED" read-only="true"/>
        <tx:methodname="persist*" isolation="DEFAULT" propagation="REQUIRED"read-only="false"/>
        <tx:methodname="modify*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:methodname="remove*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
    </tx:attributes>
</tx:advice>

3、將通知織入到目標對象

<!--將通知織入到目標對象-->

<aop:config>
    <!--切點-->
    <aop:pointcut id="txPc"expression="execution(*cn.hd.spring_transaction..impl.*ServiceImpl.*(..))"></aop:pointcut>
    <!--切面-->
    <aop:advisoradvice-ref="myAdvice" pointcut-ref="txPc"></aop:advisor>
</aop:config>

配置切面不再使用aopaspect,而是aopadvisor     

(3)、註解配置

       1、開啓註釋模式

              <!--開啓註解模式-->

<tx:annotation-driven></tx:annotation-driven>

       2、在想設置的事務的地方,加上註解

       @Transactional(isolation= Isolation.DEFAULT,propagation =

Propagation.REQUIRED,readOnly = false)

可以有兩個位置:

1、類上面,該類中所有的方法都會使用以上的參數事務。

       2、方法名上面,該方法使用參數中的事務

       如果兩個都設置以方法名上面的事務爲準。


發佈了87 篇原創文章 · 獲贊 381 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章