国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲精品乱码久久久久久金桔影视 | 欧美日韩在线一区 | 三级黄色在线视频 | 中文字幕欧美激情 | 99精品欧美一区二区三区综合在线 | 国产视频黄在线观看 | 在线观看免费av网 | 精品国产一区二区在线 | 国产亚洲精品美女久久久久久久久久 | 99热国产精品 | 91精品蜜臀在线一区尤物 | 精品无人区一区二区三区动漫 | 亚洲不卡 | 久草 在线 | 天天久久 | 91在线公开视频 | 黄工厂精品免费观看 | 国产免费激情视频 | 黄色在线网站 | 国内精品久久久久久久影视简单 | 欧洲一级毛片 | 亚洲国产成人精品女人久久 | 在线观看成人 | 日韩三级| 最新国产精品 | 免费午夜视频 | 色香阁99久久精品久久久 | 久久社区 | 午夜精品久久久久久久久久久久 | 91精品视频免费在线观看 | 欧美一区二区三区在线 | 亚洲视频第一页 | xvideos.蜜桃一区二区 | www.久久.com | 亚洲精品一区 | 午夜影院在线 | 日韩在线观看中文字幕 | 国产精品午夜在线观看 | 日韩不卡一区二区 | 欧美日韩一区二区三区免费视频 | 国产高清美女一级a毛片久久 |