1. 程式人生 > >SSM框架中以註解形式實現事務管理

SSM框架中以註解形式實現事務管理

如何整合SpringSpringMVCMyBatis這三大框架。但是沒有說到如何配置mybatis的事務管理,實現開發中,事務是必不可少的。本篇作為對上一篇的補充,說明在SSM框架中如何使用註解的形式進行事務管理

什麼是事務?

在編寫業務的過程中,會需要進行事務處理,當需要執行多條插入語句時,如果前幾條成功,而最後一條失敗,那麼我們需要回滾資料庫操作,保持資料的一致性和完整性,此時,就需要利用DB的事務處理。事務是恢復和併發控制的基本單位。

簡單來說,所謂的事務,是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。

事務應該具有4個屬性:原子性、一致性、隔離性、永續性。這四個屬性通常稱為

ACID特性。

原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。Ø

一致性(consistency)。事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。Ø

隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。Ø

永續性(durability)。持續性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。Ø

MyBatis

整合Spring事務管理

SSM框架中,使用的是Spring的事務管理機制。Spring可以使用程式設計式實現事務,宣告式實現事務以及註解式實現事務。本文主要說一下如何使用註解式@Transanctional實現實現事務管理。

本文程式碼例子基於上一篇博文,具體程式碼SSM三大框架整合詳細教程》中已經給出。簡單看下目錄結構以及實體類:

1、配置spring-mybatis.xml檔案

如要實現註解形式的事務管理,只需要在配置檔案中加入以下程式碼即可:

<!-- 開啟事務註解驅動 -->

<tx:annotation-driven/>

<!-- (事務管理)transactionmanager, use JtaTransactionManager for global tx -->

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>

當然,如果此時xml檔案報錯,那是由於沒有引入xmlnsschema導致的,無法識別文件結構。引入標頭檔案即可,以下是我的,根據自己需要引入:

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:tx="http://www.springframework.org/schema/tx"xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xsi:schemaLocation="http://www.springframework.org/schema/beans 

 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 

 http://www.springframework.org/schema/context 

 http://www.springframework.org/schema/context/spring-context-3.1.xsd

 http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd 

                                                             http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd 

 http://www.springframework.org/schema/mvc 

 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

2、如何使用

在此用一個小例子來測試事務管理是否成功配置。程式碼基礎是SSM框架搭建裡面的測試程式碼。我們現在測試的方法是:我要插入一個User物件的集合,如果此物件數量小於2,那麼可以成功插入,但是如果大於2,那麼就丟擲異常(事務處理必須丟擲異常,只有這樣Spring才幫助事務回滾),這樣資料庫就會回滾,不插入任何資料。測試結果如果資料庫沒插入任何資料,那麼表示事務處理配置成功,反正,失敗。

注意@Transactional只能被應用到public方法上,對於其它非public的方法,如果標記了@Transactional也不會報錯,但方法沒有事務功能。

實體類、DAO介面,業務介面,以及業務實現都有,這個測試僅需要在業務層中新增一個方法,然後使用JUnit測試即可,業務實現類中新增如下方法,注意註解@Transactional

/**

  * 事務處理必須丟擲異常,Spring才會幫助事務回滾

  * @param users

  */

 @Transactional

 @Override

  publicvoid insertUser(List<User> users) {

// TODO Auto-generated method stub

   for (int i = 0; i < users.size(); i++) {

     if(i<2){

       this.userDao.insert(users.get(i));

}

     else {

       thrownew RuntimeException();

}

}

}

接下來在測試類中新增如下方法進行測試:

@Test

public void testTransaction(){

List<User> users = new ArrayList<User>();

for(int i=1;i<5;i++){

     User user = newUser();

user.setAge(i);

user.setPassword(i+"111111");

user.setUserName("測試"+i);

users.add(user);

    }

this.userService.insertUser(users);

  }

注意:此時進行JUnit測試會發現出現錯誤,這是因為方法中丟擲了這個異常。實質上確實進行了事務管理,資料沒有插入,此時表示配置成功了;反之,如果去掉註解,那麼前兩條資料會插入成功,然後後面會丟擲異常。