1.什么是事物?
事務是一組操作的執行單元,相對於數據庫操作來講,事務管理的是一組SQL指令,比如增加,修改,刪除等,事務的一致性,要求,這個事務內的操作必須全部執行成功,如果在此過程種出現了差錯,比如有一條SQL語句沒有執行成功,那么這一組操作都將全部回滾!
2.事物的四大特性:
Atomic(原子性):要么都成功,要么都失敗;
Consistent(一致性):數據應該不被破壞;
Isolate(隔離性):用戶間操作不相混淆 ;
Durable(持久性):永久保存
3.實際開發中,需要事物控制,放在那一層較好?
一個業務的成功: 表示調用service方法執行成功, service調用的所有dao都要執行成功!所以,事物控制放在Service層比較好!
4.事物控制:
JDBC:
先獲取Connection連接對象,然后再設置事物手動提交,
如果是SpringJdbc操作的話可以通過:DataSourceTransactionManager控制;
Hibernate:
先獲取Session對象,再開啟事物
Hibernate的事物管理器類是:HibernateTransactionManger
5.傳統的事物控制(總結):
優點:事物的控制范圍精細,可以對指定的代碼進行事物控制;
缺點:每次操作數據庫,都需要寫重復的代碼,開發比較繁瑣; 業務邏輯代碼與事物控制代碼,耦合度太高,不符合軟件開發規范!
6.Spring提供的解決方案:聲明式事物管理
事物控制代碼,Spring已經寫好,開發者如果想使用事物控制,只需要在bean.xml或者application.xml進行AOP配置即可!
方式一:通過XMl配置實現:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xmlns:tx="http://www.springframework.org/schema/tx" 8 xsi:schemaLocation="http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context.xsd 12 http://www.springframework.org/schema/aop 13 http://www.springframework.org/schema/aop/spring-aop.xsd 14 http://www.springframework.org/schema/tx 15 http://www.springframework.org/schema/tx/spring-tx.xsd"> 16 17 <!-- 1. C3p0數據源 --> 18 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 19 <property name="driverClass" value="com.mysql.jdbc.Driver"></property> 20 <property name="jdbcUrl" value="jdbc:mysql:///emp_sys"></property> 21 <property name="user" value="root"></property> 22 <property name="password" value="root"></property> 23 <property name="initialPoolSize" value="3"></property> 24 <property name="maxPoolSize" value="6"></property> 25 </bean> 26 27 <!-- 2. JdbcTemplate工具類 --> 28 <bean id="jdbcTemlate" class="org.springframework.jdbc.core.JdbcTemplate"> 29 <property name="dataSource" ref="dataSource"></property> 30 </bean> 31 32 <!-- 3. dao 實例 --> 33 <bean id="deptDao" class="cn.itcast.a_tx_jdbc_xml.DeptDao"> 34 <property name="jdbcTemplate" ref="jdbcTemlate"></property> 35 </bean> 36 37 <!-- 4. service 實例 --> 38 <bean id="deptService" class="cn.itcast.a_tx_jdbc_xml.DeptService"> 39 <property name="deptDao" ref="deptDao"></property> 40 </bean> 41 42 43 <!-- 44 5. JDBC事務管理配置: 45 事務控制器: DataSourceTransactionManager 46 要給攔截器目標方法的執行,給目標方法增加事務控制! 48 事務控制過程: 49 1. 執行deptService.save(new Dept()) 方法時候; 50 2. deptService.save()是被切入點表達式攔截 51 3. 找事務通知: advice-ref="txAdvice" 52 4. 再通過事務通知,找到事務管理器類; transaction-manager="txManger" 53 54 --> 55 56 57 58 <!-- 5.1 事務管理器類配置 --> 59 <!-- 注意: 需要注入數據源對象! --> 60 <bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 61 <property name="dataSource" ref="dataSource"></property> 62 </bean> 63 64 <!-- 5.2事務通知: 攔截到指定的方法后進行怎樣的事務管理 --> 65 <!-- 注意: 需要引入事務管理器類(攔截到指定的方法,且指定對指定的方法如何管理事務后,再應用事務管理器事務控制代碼!) --> 66 <!-- get* 表示對所有的以get開頭的方法如何管理事務,即只讀! --> 67 <!-- * 最后一個* 表示上面都不滿足情況的其他方法,采用的事務是讀寫的! --> 68 <tx:advice id="txAdvice" transaction-manager="txManger"> 69 <tx:attributes> 70 <tx:method name="get*" read-only="true"/> 71 <tx:method name="find*" read-only="true"/> 72 <tx:method name="*" read-only="false"/> 73 </tx:attributes> 74 </tx:advice> 75 76 77 <!-- 5.3Aop 配置 = 切入點表達式(指定給哪些對象生成代理對象) + 應用上面的事務通知 --> 78 <!-- 需要引入事務通知控制,以及通過切入點表達式指定攔截的方法 --> 79 <aop:config> 80 <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn..*Service.*(..))"/> 81 </aop:config> 82 83 </beans>
方式二:通過注解的形式實現:
只需要在配置事物管理器后開啟事物注解掃描即可!
1 <!-- 2 添加事物控制: 3 1.引入名稱空間: 4 2.配置事物管理類; 5 3.以注解的方式開啟聲明式事務管理: 6 4.在對應的方法或者類上添加注解 7 --> 8 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 9 <property name="dataSource" ref="dataSource"></property> 10 </bean> 11 <!-- 開啟事物注解掃描--> 12 <tx:annotation-driven transaction-manager="txManager"/>
使用注解:@Transactional
1.定義到方法上,表示給當前方法應用事務!
2.定義到類上,則執行該類上所有方法的時候,應用事務!
3.定義到父類上,當在子類中執行父類的@Transactional修飾的方法的時候,應用事務!
事物的常用屬性:
isolation=Isolation.DEFAULT, 事務隔離級別為默認
timeout = -1, -1表示不超時,最終由底層數據庫系統決定
rollbackFor=ArithmeticException.class 遇到指定的異常才回滾數據
noRollbackFor=ArithmeticException.class 遇到指定的異常不回滾
readOnly = false 事務是否只讀, 如果事務只讀不能修改數據!(true:只讀,一般查詢方法用 false:可讀寫,修改數據使用)
propagation=Propagation.REQUIRED 事務的傳播行為:
REQUIRED:必須有事物環境,如果當前運行環境有事物,則加入當前事物環境,如果沒有則開啟一個新的事物;
REQUIRESNEW 必須有事務環境,不管當前運行環境有沒有事務, 都給目標方法開啟一個新的事務!
SUPPORTS 可以支持事務: 如果有事務環境則支持,如果沒有方法沒有事務環境,就不開啟事務!
XML配置、注解方式實現聲明式事物管理(總結):
1. XML配置方式:
更加靈活,可移植性強,便於后期維護(所有配置均在bean.xml中實現,與業務代碼無關!)
如果后面不想使用事物,直接移除配置即可,而不用修改代碼!(最大程度上實現了業務代碼與事物控制解耦)
2.注解方式:
簡化了配置,同時提升了開發效率!
方法或者類上需要些注解,如果不想使用事物控制了,需要移除所有方法上的注解
無法在方法內給某幾行代碼添加事物控制(與傳統的事物控制最大的區別);
備注:一般項目中事物控制,都是基於xml配置的方式!因為這是比較通用的配置,只需要書寫一次即可,維護也比較方便!