Spring中@Transactional事務回滾實例及源碼_第1頁
Spring中@Transactional事務回滾實例及源碼_第2頁
Spring中@Transactional事務回滾實例及源碼_第3頁
Spring中@Transactional事務回滾實例及源碼_第4頁
Spring中@Transactional事務回滾實例及源碼_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一、使用場景舉例在了解Transactional怎么用之前我們必須要先知道Transactional有什么用。下面舉個栗子:比如一個部門里面有很多成員,這兩者分別保存在部門表和成員表里面,在刪除某個部門的時候,假設我們默認刪除對應的成員。但是在執(zhí)行的時候可能會出現這種情況,我們先刪除部門,再刪除成員,但是部門刪除成功了,刪除成員的時候出異常了。這時候我們希望如果成員刪除失敗了,之前刪除的部門也取消刪除。這種場景就可以使用Transactional事物回滾。二、checked異常和unchecked異常這里之所以讓大家清楚checked異常和unchecked異常概念,是因為:Spring使用聲

2、明式事務處理,默認情況下,如果被注解的數據庫操作方法中發(fā)生了unchecked異常,所有的數據庫操作將rollback;如果發(fā)生的異常是checked異常,默認情況下數據庫操作還是會提交的。checked異常:表示無效,不是程序中可以預測的。比如無效的用戶輸入,文件不存在,網絡或者數據庫鏈接錯誤。這些都是外在的原因,都不是程序內部可以控制的。必須在代碼中顯式地處理。比如try-catch塊處理,或者給所在的方法加上throws說明,將異常拋到調用棧的上一層。繼承自java.lang.Exception(java.lang.RuntimeException除外)。unchecked異常:表示錯誤

3、,程序的邏輯錯誤。是RuntimeException的子類,比如IllegalArgumentException, NullPointerException和IllegalStateException。不需要在代碼中顯式地捕獲unchecked異常做處理。繼承自java.lang.RuntimeException(而java.lang.RuntimeException繼承自java.lang.Exception)??聪旅娴漠惓=Y構圖或許層次感更加深些:三、Transactional的使用實例本實例采用的是Eclipse+maven,maven只是作為jar管理,即便不了解的maven的猿友也可

4、以讀懂。3.1、spring的配置文件里面必須先配置tx名字空間如下:為了使用基于Transactional的事務管理,需要在Spring中進行如下的配置:<bean id="appTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> &

5、lt;tx:annotation-driven proxy-target-class="false" transaction-manager="appTransactionManager" />博主的整個spring配置文件:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="http:/www.w3.

6、org/2001/XMLSchema-instance" xmlns:context="/schema/context" xmlns:tx="/schema/tx" xmlns:aop="/schema/aop" xsi:schemaLocation=" /schema/txhttp:/

7、/schema/tx/spring-tx-2.5.xsd/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/aop/schema/aop/spring-aop-3.0.xsd/schema/contexth

8、ttp://schema/context/spring-context-3.0.xsd"> <!- 引入jdbc配置文件 -> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <va

9、lue>classpath:properties/*.properties</value> <!-要是有多個配置文件,只需在這里繼續(xù)添加即可 -> </list> </property> </bean> <!- 配置數據源 -> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!- 不使用properties來配置 ->

10、 <!- <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql:/localhost:3306/learning" /> <property name="username" value="root" /> <property name="password"

11、 value="christmas258" /> -> <!- 使用properties來配置 -> <property name="driverClassName"> <value>$jdbc_driverClassName</value> </property> <property name="url"> <value>$jdbc_url</value> </property> <property name

12、="username"> <value>$jdbc_username</value> </property> <property name="password"> <value>$jdbc_password</value> </property> </bean> <bean id="appTransactionManager" class="org.springframework.jdbc.datasource.Dat

13、aSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven proxy-target-class="false" transaction-manager="appTransactionManager" /> <!- 自動掃描了所有的XxxxMapper.xml對應的mapper接口文件,這樣就不用一個一個手動

14、配置Mpper的映射了,只要Mapper接口類和Mapper映射文件對應起來就可以了。 -> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.luo.dao" /> </bean> <!- 配置Mybatis的文件 ,mapperLocations配置*Mapper.xml文件位置,configLocation配置mybatis

15、-config文件位置-> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <property

16、 name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> <!- <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" /> -> </bean> <!- 自動掃描注解的bean -> <context:component-scan base-package="com.luo

17、.service" /></beans>3.2、使用Transactional,在添加用戶實現類方法加上注解Transactional(propagation=Propagation.REQUIRED)public void addUser(User user) userDao.addUser(user); String string = null; if(string.equals("") int i = 0; 上面的方法我故意讓其出現空指針異常,會事物回滾3.3、運行單元測試類Test public void addUserTest() Us

18、er user = new User(); user.setUserName("luoguohui1"); user.setUserPassword("luoguohui1"); userService.addUser(user);發(fā)現無法插入進去,但是如果把Transactional去掉,即代碼如下,雖然出現異常,但是數據庫中還是有添加對應數據的:3.4、源碼下載本文的工程是在mybatis入門(含實例教程和源碼)的基礎上修改的,該文包含了數據庫腳本及工程搭建的詳細流程。本文最終源碼下載:四、Spring中的Transactional必須要了解的概念S

19、pring中的Transactional基于動態(tài)代理的機制,提供了一種透明的事務管理機制,方便快捷解決在開發(fā)中碰到的問題。一般使用是通過如下代碼對方法或接口或類注釋:Transactional(propagation=Propagation.NOT_SUPPORTED)Propagation支持7種不同的傳播機制:REQUIRED:如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。SUPPORTS: 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執(zhí)行。但是對于事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。NOT_SUPPORTE

20、D:總是非事務地執(zhí)行,并掛起任何存在的事務。REQUIRESNEW:總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。MANDATORY:如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。NEVER:總是非事務地執(zhí)行,如果存在一個活動事務,則拋出異常NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動事務,則按REQUIRED屬性執(zhí)行。· 在需要事務管理的地方加Transactional 注解。Transactional 注解可以被應用于接口定義和接口方法、類定義和類的 public 方法上。· Transactional 注解只能應用到 pub

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論