我們在開發(fā)過程中,經(jīng)常會需要事務(wù)管理。比如,我們在執(zhí)行某業(yè)務(wù)時,需要向表A、表B、表C更新數(shù)據(jù),如果此業(yè)務(wù)執(zhí)行成功,則表A、表B、表C更新數(shù)據(jù);如果此業(yè)務(wù)執(zhí)行失敗,則表A、表B、表C回滾到初始狀態(tài)。 由于我們的業(yè)務(wù)邏輯是在service層控制,因此,我們在service注入相關(guān)dao。我們在Service執(zhí)行業(yè)務(wù)邏輯,分別更新數(shù)據(jù)到表A、表B、表C,通過sPRing aop 事務(wù)管理,保證Service層每個method的事務(wù)性。 下面我們講解如何在applicationContext.xml配置spring AOP事務(wù): 1.聲明dataSource
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="#{ nplat['db.driverClass'] }" /> <property name="jdbcUrl" value="#{ nplat['db.jdbcUrl'] }" /> <property name="user" value="#{ nplat['db.user'] }" /> <property name="passWord" value="#{ nplat['db.password'] }" /> <property name="initialPoolSize" value="#{ nplat['c3p0.initialPoolSize'] }" /> <property name="minPoolSize" value="#{ nplat['c3p0.minPoolSize'] }" /> <property name="maxPoolSize" value="#{ nplat['c3p0.maxPoolSize'] }" /> <property name="acquireIncrement" value="#{ nplat['c3p0.acquireIncrement'] }" /> <property name="maxIdleTime" value="#{ nplat['c3p0.maxIdleTime'] }" /> <property name="maxStatements" value="#{ nplat['c3p0.maxStatements'] }" /> <property name="maxStatementsPerConnection" value="100" /> <!--每隔60s時間檢測連接是否可正常使用(unit: scond) --> <property name="idleConnectionTestPeriod" value="60" /> <!-- 獲取connnection時測試是否有效 --> <property name="testConnectionOnCheckin" value="true" /> <!-- 連接測試語句 --> <property name="preferredTestQuery" value="#{ nplat['c3p0.testsql'] }" /> <property name="checkoutTimeout" value="10000" /> <property name="numHelperThreads" value="5" /></bean>2.聲明sessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="c3p0DataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">#{ nplat['db.dialect'] }</prop> <prop key="hibernate.hbm2ddl.auto">none</prop> <prop key="hibernate.connection.release_mode">after_transaction</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.max_fetch_depth">3</prop><!-- 抓取的級聯(lián)深度 --> <prop key="hibernate.jdbc.fetch_size">50</prop><!-- 批量抓取的數(shù)量.MySQL不支持 --> <prop key="hibernate.jdbc.batch_size">30</prop><!-- 批量寫入的數(shù)量 --> <prop key="javax.persistence.validation.mode">none</prop><!-- HiberV3.5以上需配置該項(xiàng) --> </props> </property> <property name="packagesToScan"> <list> <value>com.gina.gc</value> </list> </property></bean>3.聲明transactionManager
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property></bean>4.聲明txAdvice
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 可以指定事物的傳播行為/隔離級別/哪些異常不需要回滾/哪些異常需要回滾 --> <tx:method name="get*" read-only="true" propagation="SUPPORTS" /> <tx:method name="find*" read-only="true" propagation="SUPPORTS" /> <tx:method name="is*" read-only="true" propagation="SUPPORTS" /> <tx:method name="check*" read-only="true" propagation="SUPPORTS" /> <tx:method name="list*" read-only="true" propagation="SUPPORTS" /> <tx:method name="find*" read-only="true" propagation="SUPPORTS" /> <tx:method name="*" read-only="false" propagation="REQUIRED" rollback-for="Exception" /> </tx:attributes></tx:advice>read-only=”true” 表明事務(wù)只讀 SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行 REQUIRED:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個事務(wù)。這是最常見的選擇 5.聲明spring aop
<aop:config> <!--expression="this(com.gina.gc.core.orm.manager.Manager)" --> <aop:pointcut id="interceptorPointCuts" expression="execution(* com.gina.gc..*.manager.*Manager.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /></aop:config>expression=”execution(* com.gina.gc...manager.*Manager.(..))” 中幾個通配符的含義: 第一個 * —— 通配 任意返回值類型 第二個 * —— 通配 包c(diǎn)om.gina.gc下的任意包 第三個 * —— 通配 包c(diǎn)om.gina.gc..*.manager下以Manager結(jié)尾的class 第四個 * —— 通配 包c(diǎn)om.gina.gc..*.manager下以Manager結(jié)尾的class的任意方法 第五個 .. —— 通配 方法可以有0個或多個參數(shù)
新聞熱點(diǎn)
疑難解答