生產項目中手動提交事務

 session.merge() 方法

 session.merge 介紹 https://blog.csdn.net/qq_36908872/article/details/102704844 

生產項目中:業務場景對於一樣的數據同時做新增和修改的操作時,項目當中的自動提交事務就會有衝突只讓你操作一次,不可以多次,就算是用上了 session.merge(Entity) 方法 也無法滿足自身的業務是 ,這個時候我們就需要手動的去提交事務。

 

Spring 手動 提交事務

1、配置文件 applicationContext.xml:

<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>

2、在需要加事務的方法上加上

DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ctx
.getBean("txManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔離級別,開啓新事務,這樣會比較安全些。
TransactionStatus status = transactionManager.getTransaction(def); // 獲得事務狀態
try {
//邏輯代碼,可以寫上你的邏輯處理代碼
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}

這是在有 ApplicationContext 的情況下、

 

 

3. ApplicationContext 不存在的情況下

 

    @Autowired

    private DataSourceTransactionManager txManager;

 

   DefaultTransactionDefinition def = new DefaultTransactionDefinition();

   def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔離級別,開啓新事務

   TransactionStatus status = txManager.getTransaction(def); // 獲得事務狀態

try{
//邏輯代碼,可以寫上你的邏輯處理代碼
txManager.commit(status);
}catch(Exception e){
txManager.rollback(status);
}

 

 

3. Spring聲明式事務配置

          

<!-- 事務配置 spring 3.0 -->

<beanid="transactionManager class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<propertyname="dataSource"ref="dataSource"/>

</bean>

<aop:config>

<aop:pointcutexpression="execution(public * com.*.service.impl.*Impl.*(..))"id="pointcut"/>

<aop:advisoradvice-ref="txAdvice"pointcut-ref="pointcut"/>

</aop:config>

<tx:adviceid="txAdvice"transaction-manager="transactionManager">

<tx:attributes>

<tx:methodname="query*"propagation="REQUIRED"read-only="true"/>

<tx:methodname="find*"propagation="REQUIRED"read-only="true"/>

<tx:methodname="get*"propagation="REQUIRED"read-only="true"/>

<tx:methodname="save*"propagation="REQUIRED"/>

<tx:methodname="add*"propagation="REQUIRED"/>

<tx:methodname="create*"propagation="REQUIRED"/>

<tx:methodname="delete*"propagation="REQUIRED"/>

<tx:methodname="del*"propagation="REQUIRED"/>

<tx:methodname="remove*"propagation="REQUIRED"/>

<tx:methodname="modify*"propagation="REQUIRED"/>

<tx:methodname="update*"propagation="REQUIRED"/>

<tx:methodname="clear*"propagation="REQUIRED"/>

</tx:attributes>

</tx:advice>

 

 

在使用Spring聲明式事務時,不需要手動的開啓事務和關閉事務,但是對於一些場景則需要開發人員手動的提交事務,比如說一個操作中需要處理大量的數據庫更改,可以將大量的數據庫更改分批的提交,又比如一次事務中一類的操作的失敗並不需要對其他類操作進行事務回滾,就可以將此類的事務先進行提交,這樣就需要手動的獲取Spring管理的Transaction來提交事務。

1、applicationContext.xml配置

複製代碼

 1 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 2     <property name="dataSource" ref="dataSource" />
 3 </bean>
 4 
 5 <tx:advice id="txAdvice" transaction-manager="transactionManager">
 6     <tx:attributes>
 7         <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
 8         <tx:method name="find*" read-only="true" propagation="SUPPORTS" />
 9         <tx:method name="get*" read-only="true" propagation="SUPPORTS" />
10         <tx:method name="select*" read-only="true" propagation="SUPPORTS" />
11         <tx:method name="list*" read-only="true" propagation="SUPPORTS" />
12         <tx:method name="load*" read-only="true" propagation="SUPPORTS" />
13     </tx:attributes>
14 </tx:advice>
15 
16 <aop:config>
17     <aop:pointcut id="servicePointCut" expression="execution(* com.xxx.xxx.service..*(..))" />
18     <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointCut" />
19 </aop:config>

複製代碼

2、手動提交事務

複製代碼

 1 @Resource(name="transactionManager")
 2 private DataSourceTransactionManager transactionManager;
 3 
 4 DefaultTransactionDefinition transDefinition = new DefaultTransactionDefinition();
 5 //開啓新事物
 6 transDefinition.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW);
 7 TransactionStatus transStatus = transactionManager.getTransaction(transDefinition);
 8 try {
 9     //TODO
10     transactionManager.commit(transStatus);
11 } catch (Exception e) {
12     transactionManager.rollback(transStatus);
13 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章