SSM框架——以注解形式实现事务管理
上一篇博文《SSM三大框架整合具體教程》具體說了怎樣整合Spring、SpringMVC和MyBatis這三大框架。
可是沒有說到怎樣配置mybatis的事務(wù)管理,實現(xiàn)開發(fā)中,事務(wù)是不可缺少的。本篇作為對上一篇的補充,說明在SSM框架中怎樣使用注解的形式進行事務(wù)管理。
什么是事務(wù)?
在編寫業(yè)務(wù)的過程中,會須要進行事務(wù)處理,當(dāng)須要運行多條插入語句時。假設(shè)前幾條成功。而最后一條失敗。那么我們須要回滾數(shù)據(jù)庫操作,保持?jǐn)?shù)據(jù)的一致性和完整性,此時,就須要利用DB的事務(wù)處理。
事務(wù)是恢復(fù)和并發(fā)控制的基本單位。
簡單來說。所謂的事務(wù),是一個操作序列。這些操作要么都運行。要么都不運行,它是一個不可切割的工作單位。
事務(wù)應(yīng)該具有4個屬性:原子性、一致性、隔離性、持久性。
這四個屬性通常稱為ACID特性。
原子性(atomicity)。一個事務(wù)是一個不可切割的工作單位,事務(wù)中包含的諸操作要么都做,要么都不做。
一致性(consistency)。事務(wù)必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到還有一個一致性狀態(tài)。
一致性與原子性是密切相關(guān)的。
隔離性(isolation)。一個事務(wù)的運行不能被其它事務(wù)干擾。
即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其它事務(wù)是隔離的。并發(fā)運行的各個事務(wù)之間不能互相干擾。
持久性(durability)。持續(xù)性也稱永久性(permanence),指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其它操作或故障不應(yīng)該對其有不論什么影響。
MyBatis集成Spring事務(wù)管理
在SSM框架中。使用的是Spring的事務(wù)管理機制。
Spring能夠使用編程式實現(xiàn)事務(wù)。聲明式實現(xiàn)事務(wù)以及注解式實現(xiàn)事務(wù)。
本文主要說一下怎樣使用注解式@Transanctional實現(xiàn)實現(xiàn)事務(wù)管理。
本文代碼樣例基于上一篇博文,具體代碼《SSM三大框架整合具體教程》中已經(jīng)給出。簡單看下文件夾結(jié)構(gòu)以及實體類:
1、配置spring-mybatis.xml文件
如要實現(xiàn)注解形式的事務(wù)管理。僅僅須要在配置文件里增加下面代碼就可以:
<!-- 開啟事務(wù)注解驅(qū)動 --> <tx:annotation-driven /> <!-- (事務(wù)管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
當(dāng)然,假設(shè)此時xml文件報錯。那是因為沒有引入xmlns和schema導(dǎo)致的。無法識別文檔結(jié)構(gòu)。引入頭文件就可以。下面是我的。依據(jù)自己須要引入:
<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/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://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、怎樣使用
在此用一個小樣例來測試事務(wù)管理是否成功配置。代碼基礎(chǔ)是SSM框架搭建里面的測試代碼。
我們?nèi)缃駵y試的方法是:我要插入一個User對象的集合。假設(shè)此對象數(shù)量小于2,那么能夠成功插入。可是假設(shè)大于2。那么就拋出異常(事務(wù)處理必須拋出異常,僅僅有這樣Spring才幫助事務(wù)回滾)。這樣數(shù)據(jù)庫就會回滾,不插入不論什么數(shù)據(jù)。測試結(jié)果假設(shè)數(shù)據(jù)庫沒插入不論什么數(shù)據(jù)。那么表示事務(wù)處理配置成功,反正,失敗。
注意@Transactional僅僅能被應(yīng)用到public方法上,對于其他非public的方法。假設(shè)標(biāo)記了@Transactional也不會報錯,但方法沒有事務(wù)功能。
實體類、DAO接口。業(yè)務(wù)接口,以及業(yè)務(wù)實現(xiàn)都有。這個測試僅須要在業(yè)務(wù)層中加入一個方法,然后使用JUnit測試就可以。業(yè)務(wù)實現(xiàn)類中加入例如以下方法,注意注解@Transactional:
/**
* 事務(wù)處理必須拋出異常。Spring才會幫助事務(wù)回滾
* @param users
*/
@Transactional
@Override
public void 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 {
throw new RuntimeException();
}
}
}
接下來在測試類中加入例如以下方法進行測試:
@Test
public void testTransaction(){
List<User> users = new ArrayList<User>();
for(int i=1;i<5;i++){
User user = new User();
user.setAge(i);
user.setPassword(i+"111111");
user.setUserName("測試"+i);
users.add(user);
}
this.userService.insertUser(users);
}
注意:此時進行JUnit測試會發(fā)現(xiàn)出現(xiàn)錯誤,這是由于方法中拋出了這個異常。實質(zhì)上確實進行了事務(wù)管理,數(shù)據(jù)沒有插入,此時表示配置成功了;反之,假設(shè)去掉注解。那么前兩條數(shù)據(jù)會插入成功。然后后面會拋出異常。
(原文地址:http://blog.csdn.net/zhshulin)
總結(jié)
以上是生活随笔為你收集整理的SSM框架——以注解形式实现事务管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRM, C4C和SAP Hybris的
- 下一篇: 喜茶联合11城文旅局推出城市文旅冰箱贴