1. 程式人生 > >Spring資料庫事務管理

Spring資料庫事務管理

一.配置事務管理器

1.1.xml事務名稱空間

xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

1.2.資料庫連線池

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <!--初始化連線大小 -->
        <property name="initialSize" value="${initialSize}"/>
        <!--連線池最大數量-->
        <property name="maxActive" value="${maxActive}"/>
        <!--連線池最大空閒 -->
        <property name="maxIdle" value="${maxIdle}"/>
        <!--連線池最小空閒 -->
        <property name="minIdle" value="${minIdle}"/>
        <!--獲取連線最大等待時間 -->
        <property name="maxWait" value="${maxWait}"/>
    </bean>

1.3.配置資料來源事務管理器

DataSourceTransactionManager定義資料庫管理器,這樣Spring就知道你將資料庫事務委託給事務管理器transactionManager了

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

二.宣告事務,2種方法

2.1(一).XML配置

與事務屬性關聯的方法名。萬用字元(*)可以用來指定一批關聯到相同的事務屬性的方法

<!-- 配置事務通知屬性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 定義事務傳播屬性 -->
        <tx:attributes>
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="select*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="*" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <!-- 配置事務切面 -->
    <aop:config>
        <aop:pointcut id="serviceOperation"
                      expression="execution(* com.hly.ssm.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
    </aop:config>

tx:method:

propagation:

1.REQURED:如果有事務在執行,當前的方法就在這個事務內執行,否則就啟動一個新的事務,並在自己的內部執行、

2.REQURES_NEW:當前的方法必須啟動新事物,並在他自己的事務內部執行,如果有事務在執行,應該將它掛起

3.SUPPORTS:如果有事務在執行,當前的方法就在這個事務內執行,否則它可以不執行在事務中

4.NOT_SUPPORTE:當前的方法不應該執行在事務中,如果有執行的事務,應將它掛起

5.MANDATORY:當前的方法必須執行在事務內部,如果沒有正在執行的事務,就丟擲異常

6.NEVER:當前的方法不應該執行在事務中,如果有執行的事務,就丟擲異常

7.NESTED:如果有事務執行,當前的方法就應該在這個事務的巢狀事務內部執行,否則就啟動一個新的事務,並將他在自己的的事務內執行

readOnly:該屬性表示指定的事務為只讀,表示這個事務只讀資料但是不更新資料,這樣可以幫助資料庫引擎優化事務。若一個方法只讀取資料,建議設定只讀屬性。將所有的以find,select,query,get開頭的查詢方法都設定為了只讀,這將大大提高查詢效率。

2.1(二).註解事務

使用註解定義事務

<tx:annotation-driven transaction-manager="transactionManager"/>

例:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;

    @Override
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED)
    public User selectUserById(String userId) {
        return userDao.selectUserById(userId);
    }

    @Override
    public int insertUser(User user) {
        return userDao.insertUser(user);
    }
}

2.2測試

@Test
    public void testSelectTransation(){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/spring/applicationContext.xml");
        UserService userService = ctx.getBean(UserService.class);
        User user = userService.selectUserById("001");
        System.out.println(user.toString());

    }

三.資料庫相關知識