SSH學習——聲明式事物管理(Spring)


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配置的方式!因為這是比較通用的配置,只需要書寫一次即可,維護也比較方便!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM