一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringMVC+MyBatis 事務管理(實例)

SpringMVC+MyBatis 事務管理(實例)

2020-12-09 14:10garfieldzf Java教程

本文先分析編程式注解事務和基于注解的聲明式事務。對SpringMVC+MyBatis 事務管理的相關知識感興趣的朋友一起學習吧

前言

        spring事務管理包含兩種情況,編程式事務、聲明式事務。而聲明式事務又包括基于注解@Transactional和tx+aop的方式。那么本文先分析編程式注解事務和基于注解的聲明式事務。 編程式事務管理使用TransactionTemplate或者PlatformTransactionManager。對于編程式事務spring推薦使用TransactionTemplate。

一、編程式事務

     spring事務特性

     spring中所有的事務策略類都繼承自org.springframework.transaction.PlatformTransactionManager接口

?
1
2
3
4
5
public interface PlatformTransactionManager {
 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
 void commit(TransactionStatus status) throws TransactionException;
 void rollback(TransactionStatus status) throws TransactionException;
}

     編程式事務TransactionTemplate需要手動在代碼中處理事務,一般不推薦使用,也不符合spring的思想,因為它直接耦合代碼,但各有利弊。先看下TransactionTemplate的源碼。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public class TransactionTemplate extends DefaultTransactionDefinition
  implements TransactionOperations, InitializingBean {
 protected final Log logger = LogFactory.getLog(getClass());
 private PlatformTransactionManager transactionManager;
 public TransactionTemplate() {
 }
 public TransactionTemplate(PlatformTransactionManager transactionManager) {
  this.transactionManager = transactionManager;
 }
 public TransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) {
  super(transactionDefinition);
  this.transactionManager = transactionManager;
 }
 public void setTransactionManager(PlatformTransactionManager transactionManager) {
  this.transactionManager = transactionManager;
 }
 public PlatformTransactionManager getTransactionManager() {
  return this.transactionManager;
 }
 @Override
 public void afterPropertiesSet() {
  if (this.transactionManager == null) {
   throw new IllegalArgumentException("Property 'transactionManager' is required");
  }
 }
 @Override
 public <T> T execute(TransactionCallback<T> action) throws TransactionException {
  if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
   return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
  }
  else {
   TransactionStatus status = this.transactionManager.getTransaction(this);
   T result;
   try {
    result = action.doInTransaction(status);
   }
   catch (RuntimeException ex) {
    // Transactional code threw application exception -> rollback
    rollbackOnException(status, ex);
    throw ex;
   }
   catch (Error err) {
    // Transactional code threw error -> rollback
    rollbackOnException(status, err);
    throw err;
   }
   catch (Throwable ex) {
    // Transactional code threw unexpected exception -> rollback
    rollbackOnException(status, ex);
    throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");
   }
   this.transactionManager.commit(status);
   return result;
  }
 }
 private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException {
  logger.debug("Initiating transaction rollback on application exception", ex);
  try {
   this.transactionManager.rollback(status);
  }
  catch (TransactionSystemException ex2) {
   logger.error("Application exception overridden by rollback exception", ex);
   ex2.initApplicationException(ex);
   throw ex2;
  }
  catch (RuntimeException ex2) {
   logger.error("Application exception overridden by rollback exception", ex);
   throw ex2;
  }
  catch (Error err) {
   logger.error("Application exception overridden by rollback error", ex);
   throw err;
  }
 }
}

  從上面的代碼可以看到核心方法是execute,該方法入參TransactionCallback<T>。查看TransactionCallback源碼:

?
1
2
3
public interface TransactionCallback<T> {
 T doInTransaction(TransactionStatus status);
}

 那么以上兩個源碼可以確定我們使用編程式事務管理的方式也就是自己需要重寫doInTransaction()。OK,那么我們手動使用TransactionTemplate處理下。

1、先配置transactionmanager

?
1
2
3
4
<!--事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
</bean>

2、配置transactionTemplate

?
1
2
3
4
5
<!--編程式事務,推薦使用TransactionTemplate-->
<bean id="transactionTemplate"
  class="org.springframework.transaction.support.TransactionTemplate">
 <property name="transactionManager" ref="transactionManager"/>
</bean>

3、業務代碼處理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Autowired
 private TransactionTemplate transactionTemplate;
 public int insertUser2(final User user) {
  Integer i= (Integer) this.transactionTemplate.execute(new TransactionCallback() {
   public Object doInTransaction(TransactionStatus transactionStatus) {
    int i = userMapper.insertUser(user);
    if (i > 0) {
     System.out.println("success");
    }
    int j = 10 / 0;
    return i;
   }
  });
  return i;
 }

  業務代碼中我們使用by zero的異常故意拋出,你會發現能繼續打印success,當你斷點debug時,你會發現數據庫一直是鎖定狀態,直到你程序執行完。如下圖:

SpringMVC+MyBatis 事務管理(實例)

二、基于Transactional注解的事務管理

    當前應該是使用最清爽的事務管理方式了,也符合spring的理念,非入侵代碼的方式。

1、配置

?
1
2
3
4
5
6
7
8
<!--事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 使用注解事務,需要添加Transactional注解屬性 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--啟用最新的注解器、映射器-->
<mvc:annotation-driven/>

2、配置后只需要在要處理的地方加上Transactional注解,而且Transactional注解的方式可以應用在類上,也可以應用在方法上,當然只針對public方法。

3、業務代碼處理

?
1
2
3
4
5
6
7
8
9
@Transactional
public int insertUser(User user) {
 int i = userMapper.insertUser(user);
 if (i > 0) {
  System.out.println("success");
 }
 int j = 10 / 0;
 return i;
}

總結

以上所述是小編給大家介紹的SpringMVC+MyBatis 事務管理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/sword-successful/p/7274929.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品视频免费视频 | 日本黄色录像视频 | 女同久久另类99精品国产 | 午夜理论片日本中文在线 | 9l国产精品久久久久麻豆 | 亚洲欧洲日产国码天堂 | 校花被扒开尿口折磨憋尿 | 国产成人亚洲精品乱码在线观看 | 久久久精品免费免费直播 | pregnanthd产子 | 国产精品一久久香蕉产线看 | 国产无套在线播放 | 成人午夜影院在线观看 | 好逼365| 亚洲国产欧美另类 | 久久这里只有精品国产精品99 | 亚洲国产精品综合欧美 | 高清国产激情视频在线观看 | 草莓茄子丝瓜番茄小蝌蚪 | 美女脱一净二净不带胸罩 | 乌克兰17一18处交 | 欧美另类杂交a | 国产视频a区| 日韩不卡一区二区三区 | 亚洲黄色小视频 | 欧美日韩国产手机在线观看视频 | 欧美日韩亚洲一区二区三区在线观看 | 好男人资源免费观看 | 日韩伦理在线免费观看 | 欧美人与物videos另类3d | 日本午夜视频 | 日本三级在丈面前被耍了 | 国产激情一区二区三区四区 | 99久久伊人精品波多野结衣 | 国产成人综合精品 | 国产haodiaose最新 | 久青草国产在视频在线观看 | 四虎2020紧急免费入口 | 韩国一大片a毛片女同 | 天天操天天爽天天射 | 2015小明台湾永久区域免费 |