国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-15 00:34:47
字體:
來源:轉載
供稿:網友
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.xsd10      http://www.springframework.org/schema/context11      http://www.springframework.org/schema/context/spring-context.xsd12      http://www.springframework.org/schema/aop13      http://www.springframework.org/schema/aop/spring-aop.xsd14      http://www.springframework.org/schema/tx15      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                 事務控制器: DataSourceTransactionManager46                 要給攔截器目標方法的執行,給目標方法增加事務控制!   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配置的方式!因為這是比較通用的配置,只需要書寫一次即可,維護也比較方便!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 伊川县| 科技| 轮台县| 濮阳市| 厦门市| 谷城县| 平凉市| 东莞市| 常州市| 黄浦区| 连山| 静海县| 武功县| 海林市| 隆安县| 石首市| 大田县| 金堂县| 新巴尔虎左旗| 孝义市| 阿图什市| 吴堡县| 青浦区| 仙居县| 三穗县| 东乡县| 阿合奇县| 东安县| 布尔津县| 宁河县| 来宾市| 岚皋县| 蒲城县| 重庆市| 兰坪| 兴业县| 喀什市| 定襄县| 县级市| 扎囊县| 台北县|