精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring事務超時到底是怎么回事?

開發 架構
Spring事務超時是指一個事務在執行中最長的允許時間。如果事務在超時時間內未能完成,則會自動回滾。超時時間可以通過設置來控制,以確保事務在規定的時間內完成或回滾,避免數據一致性問題。

環境:Spring5.3.23

Spring事務超時是指一個事務在執行中最長的允許時間。如果事務在超時時間內未能完成,則會自動回滾。超時時間可以通過設置來控制,以確保事務在規定的時間內完成或回滾,避免數據一致性問題。

在工作中你有配置事務的超時時間嗎?如何進行配置事務超時時間?

1. 配置事務超時時間

注解方式:

// 這里單位是s
@Transactional(timeout = 2)
public void save() {
}

編程方式1:

@Resource
private PlatformTransactionManager tm ;


DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
definition.setTimeout(2) ;

編程方式2:

@Resource
private PlatformTransactionManager tm ;
public void update() {
  TransactionTemplate template = new TransactionTemplate(tm) ;
  template.setTimeout(2) ;
  template.execute(new TransactionCallback<Object>() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
      // ...
      return null ;
    }
  }) ;
}

以上3種方式讀可以進行事務超時的設置,什么情況下才能算是事務超時呢?

2. 準備環境

準備一張2000w數據的表

圖片圖片

表字段信息如下:

圖片圖片

此表除主鍵外沒有任何的索引。

圖片圖片

3. 模擬事務超時

  • 測試1

統計查詢表的數據量,將該操作放到一個事務中,同時設置事務的超時時間。

// 將超時時間設置為20s
@Transactional(timeout = 20)
public void query() {
  long start = System.currentTimeMillis() ;
  jdbcTemplate.execute("select count(*) from p_user") ;
  System.out.println("耗時:" + (System.currentTimeMillis() - start) + "毫秒") ;
}

執行結果:

耗時:3198毫秒

接下來將超時時間改成3s

執行結果如下:

13:56:01.425 [main] WARN  c.zaxxer.hikari.pool.ProxyConnection - HikariPool-1 - Connection com.mysql.cj.jdbc.ConnectionImpl@504ecd marked as broken because of SQLSTATE(null), ErrorCode(0)
com.mysql.cj.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
  at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113)
  at com.mysql.cj.jdbc.StatementImpl.checkCancelTimeout(StatementImpl.java:2167)

從異常信息看到拋出了超時異常。這里的超時是sql執行的超時,是由我們的驅動程序拋出的異常。

  • 測試2

模擬其它非數據庫操作耗時,而這個是在執行數據庫操作之前

@Transactional(timeout = 2)
public void query() {
  long start = System.currentTimeMillis() ;
  try {
    TimeUnit.SECONDS.sleep(3) ;
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  // 執行非常簡單的操作
  jdbcTemplate.execute("select 1") ;
  System.out.println("耗時:" + (System.currentTimeMillis() - start) + "毫秒") ;
}

執行結果:

14:08:44.000 [main] DEBUG o.s.jdbc.core.JdbcTemplate - Executing SQL statement [select 1]
Exception in thread "main" org.springframework.transaction.TransactionTimedOutException: Transaction timed out: deadline was Wed Oct 11 14:08:42 CST 2023
  at org.springframework.transaction.support.ResourceHolderSupport.checkTransactionTimeout(ResourceHolderSupport.java:155)

拋出了超時異常,而這個異常是由Spring框架拋出的。

  • 測試3

模擬其它非數據庫操作耗時,而這個是在執行數據庫操作之后,適當調整上面的代碼順序

@Transactional(timeout = 2)
public void query() {
  long start = System.currentTimeMillis() ;
  jdbcTemplate.execute("select 1") ;
  try {
    TimeUnit.SECONDS.sleep(3) ;
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.println("耗時:" + (System.currentTimeMillis() - start) + "毫秒") ;
}

執行結果:

耗時:3015毫秒

程序正常運行

  • 測試4

在測試3的基礎上,最后再次執行數據庫相關的操作

@Transactional(timeout = 2)
public void query() {
  long start = System.currentTimeMillis() ;
  jdbcTemplate.execute("select 1") ;
  try {
    TimeUnit.SECONDS.sleep(3) ;
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.println("耗時:" + (System.currentTimeMillis() - start) + "毫秒") ;
  // 再次執行數據庫相關操作
  jdbcTemplate.execute("select 1") ;
}

執行結果:

耗時:3024毫秒
14:14:38.257 [main] DEBUG o.s.jdbc.core.JdbcTemplate - Executing SQL statement [select 1]
Exception in thread "main" org.springframework.transaction.TransactionTimedOutException: Transaction timed out: deadline was Wed Oct 11 14:14:37 CST 2023
  at org.springframework.transaction.support.ResourceHolderSupport.checkTransactionTimeout(ResourceHolderSupport.java:155)

第一個數據庫操作,沒有拋出異常,直到第二個執行時拋出了異常。

總結:      事務方法開始執行時就開始計時,在執行到數據庫操作時判斷當前的執行時間點是否已經超過了設置的超時時間,如果是則拋出Timeout異常。

4. 事務超時原理

在開始一個事務時會在DataSourceTransactionManager#doBegin方法中設置超時時間

protected void doBegin(Object transaction, TransactionDefinition definition) {
  int timeout = determineTimeout(definition);
  if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) {
    // 如果注解@Transactional中設置了timeout,則設置超時時間
    txObject.getConnectionHolder().setTimeoutInSeconds(timeout);
  }
}
protected int determineTimeout(TransactionDefinition definition) {
  if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
    return definition.getTimeout();
  }
  return getDefaultTimeout();
}

當通過JdbcTemplate操作數據庫時,還會執行如下操作

public class JdbcTemplate {
  private <T> T execute(StatementCallback<T> action, boolean closeResources) {
    Statement stmt = null;
    try {
      stmt = con.createStatement();
      // 配置Statement對象,這其中會設置超時時間
      applyStatementSettings(stmt);
      // ...
      return result;
    }
  }  
  protected void applyStatementSettings(Statement stmt) throws SQLException {
    // ...
    // getQueryTimeout方法返回的是當前JdbcTemplate對象中設置d餓超時時間
    DataSourceUtils.applyTimeout(stmt, getDataSource(), getQueryTimeout());
  }
}

DataSourceUtils工具類

public abstract class DataSourceUtils {
  public static void applyTimeout(Statement stmt, @Nullable DataSource dataSource, int timeout) throws SQLException {
    ConnectionHolder holder = null;
    if (dataSource != null) {
      holder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
    }
    // 如果當前事務執行配置了超時時間
    if (holder != null && holder.hasTimeout()) {
      // 剩余事務超時將覆蓋指定的值。
      stmt.setQueryTimeout(holder.getTimeToLiveInSeconds());
    }
    else if (timeout >= 0) {
      // No current transaction timeout -> apply specified value.
      stmt.setQueryTimeout(timeout);
    }
  }  
}

ResourceHolderSupport類

public abstract class ResourceHolderSupport implements ResourceHolder { 
  public int getTimeToLiveInSeconds() {
    double diff = ((double) getTimeToLiveInMillis()) / 1000;
    int secs = (int) Math.ceil(diff);
    // 檢查超時時間
    checkTransactionTimeout(secs <= 0);
    return secs;
  }
  private void checkTransactionTimeout(boolean deadlineReached) throws TransactionTimedOutException {
    if (deadlineReached) {
      // 設置事務回滾
      setRollbackOnly();
      // 拋出異常
      throw new TransactionTimedOutException("Transaction timed out: deadline was " + this.deadline);
    }
  }
}

完畢!!!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2021-10-15 21:16:00

手機內存漏洞

2022-04-15 08:54:39

PythonAsync代碼

2023-03-29 08:24:30

2019-07-23 15:34:29

MySQL存儲引擎

2018-01-28 13:59:23

小程序微信開發者

2015-05-29 09:34:13

2018-03-13 10:32:43

2022-05-26 11:36:12

APK文件小米

2010-04-20 09:55:37

2020-02-18 11:19:36

物聯網病毒物聯網IOT

2022-01-25 20:23:21

聯邦通信委員會聯邦航空管理局5G

2020-08-12 09:10:16

AI芯片AI人工智能

2021-06-04 11:10:04

JavaScript開發代碼

2020-02-04 17:42:17

寬帶運營商攜號轉網

2016-11-22 19:54:56

點擊率預估推薦算法廣告

2013-04-18 09:56:05

2023-03-05 15:41:58

MySQL日志暴漲

2021-05-11 11:51:15

飛機Wi-Fi通信

2024-01-08 08:35:28

閉包陷阱ReactHooks

2023-06-13 18:45:00

研究監督
點贊
收藏

51CTO技術棧公眾號

亚洲欧美韩国| 国产伦精品一区二区三区免.费| 亚洲成aⅴ人片久久青草影院| 色系网站成人免费| 一区精品视频| 婷婷丁香花五月天| 美女一区二区视频| 欧美极品少妇xxxxⅹ免费视频| 精品人妻一区二区三区香蕉 | 91精品精品| 日韩av在线网页| 久久久久久久久久一区| 欧美1—12sexvideos| 久久精品夜色噜噜亚洲aⅴ| 91在线精品视频| 国产91国语对白在线| 中文字幕免费一区二区三区| 亚洲欧美成人一区二区在线电影| 想看黄色一级片| 国产精品伦理| 亚洲成人免费看| 一区二区三区的久久的视频| 性xxxx搡xxxxx搡欧美| 国产在线精品一区二区| 国产精品福利小视频| 精品一区免费观看| 天天射—综合中文网| 亚洲欧美日韩成人| 精品人妻在线视频| 试看120秒一区二区三区| 欧洲色大大久久| 北条麻妃69av| av电影院在线看| 亚洲美女屁股眼交3| 日韩中文不卡| 色视频在线观看免费| 成人午夜av影视| 999国产在线| 最近日韩免费视频| 可以看av的网站久久看| 韩国v欧美v日本v亚洲| 国产探花在线播放| 日本久久一二三四| 一区二区av在线| 久久精品免费在线观看| 黄页网站在线观看免费| 六月丁香久久丫| 久久99国产精品视频| 国产精品自产拍| 中文字幕一区二区三区人妻在线视频 | 久久精品国产v日韩v亚洲| 日韩无码精品一区二区| 在线精品国产亚洲| 日韩午夜精品电影| 男男受被啪到高潮自述| 亚洲日本视频在线| 精品国产一区二区三区忘忧草 | 探花国产精品一区二区| 日韩精品一卡二卡三卡四卡无卡| 国产97在线播放| 99re国产在线| 蜜桃视频免费观看一区| 成人精品一区二区三区| 国产福利小视频| 国产99久久精品| 免费一区二区| 亚洲成人网在线观看| 国产51自产区| 神马香蕉久久| 国产亚洲欧美视频| 国产传媒视频在线| 久久久久久久久99精品大| 欧美成年人在线观看| 黑鬼狂亚洲人videos| 欧美日韩一区二区高清| 久久久久久久网站| 五月天综合激情网| 日韩avvvv在线播放| 国产精品无av码在线观看| 一级黄色大片免费观看| 国产一区不卡精品| 精品视频在线观看| 在线a免费看| 一区二区三区四区亚洲| av免费观看网| 亚洲免费资源| 日韩成人在线视频| 毛片久久久久久| 亚洲图片在线| 国产成人精品av| 亚洲午夜精品久久久| 丁香六月综合激情| 亚洲精品国产suv| 99亚洲精品视频| 超级碰碰不卡在线视频| 粉嫩av一区二区三区免费野| 在线观看免费av网址| 国产 日韩 欧美 综合 一区| 一区二区成人精品| 久久久全国免费视频| 丝袜诱惑制服诱惑色一区在线观看| 成人写真福利网| 欧美日韩高清一区二区不卡 | 免费av中文字幕| 黄网站免费久久| 精品视频免费观看| 18+激情视频在线| 色婷婷国产精品久久包臀| 爱豆国产剧免费观看大全剧苏畅| 卡通动漫精品一区二区三区| 久久综合久久88| 亚洲GV成人无码久久精品| 国产乱理伦片在线观看夜一区| 欧美日韩一区二区视频在线| 在线播放免费av| 精品视频一区三区九区| 小毛片在线观看| 亚洲精品a级片| 国产精品久久久久久久久久新婚| 少妇人妻一区二区| 亚洲男人的天堂在线观看| 少妇激情一区二区三区| 日韩激情啪啪| 久久久免费电影| 国产伦一区二区| 国产精品网站在线播放| 国产亚洲欧美在线视频| 成人免费直播在线| 欧美成人精品在线| 亚洲一区二区激情| 电影一区二区| 欧美性猛交xxxx乱大交3| 国产精品久久久久野外| www.国产免费| 欧美在线免费| 91在线色戒在线| 日本中文字幕在线观看| 色婷婷av一区二区| 国产精品毛片一区二区| 久久国产88| 噜噜噜噜噜久久久久久91| 98色花堂精品视频在线观看| 精品久久久久久久久久久久久久久久久| 一本在线免费视频| 热久久国产精品| 日韩妆和欧美的一区二区| 亚洲校园激情春色| 亚洲美女精品成人在线视频| 国产黄色片免费看| 99久久精品情趣| 国产av人人夜夜澡人人爽麻豆 | 国产高清自拍一区| 欧洲黄色一区| 精品福利一区二区三区 | 调教视频免费在线观看| 欧美日韩精品一区二区三区四区| 久久久久99精品成人| 久久97超碰国产精品超碰| 亚洲啪啪av| 国产人与zoxxxx另类91| 欧美丰满少妇xxxxx| 人人妻人人玩人人澡人人爽| 午夜精品在线看| 强伦人妻一区二区三区| 日韩精品亚洲专区| 亚洲午夜精品国产| 精品久久国产一区| 韩国精品美女www爽爽爽视频| 亚洲欧美日韩成人在线| 在线视频欧美精品| 老熟妇高潮一区二区三区| 国产成人日日夜夜| 少妇高潮喷水久久久久久久久久| 国产伦一区二区三区| 成人免费淫片aa视频免费| 午夜影院免费在线| 国产视频久久久久久久| 中文字幕在线观看精品| 亚洲精品国产一区二区三区四区在线| 欧美性生交xxxxx| 久久久久中文| 午夜探花在线观看| 精品女人视频| 国产精品免费福利| 日本大胆在线观看| 亚洲色图av在线| 999精品国产| 欧美日韩国产色视频| 欧美福利第一页| 国产91精品一区二区麻豆网站 | 亚洲天堂av网| 精品国产无码AV| 色噜噜狠狠成人网p站| 成人在线观看小视频| 91免费视频观看| 91在线第一页| 久久www成人_看片免费不卡| 中文字幕乱码一区二区三区| 日本妇女一区| 91高跟黑色丝袜呻吟在线观看| 中文不卡1区2区3区| 久久久国产影院| 国产一二三在线观看| 日韩欧美精品在线视频| 自拍偷拍第八页| 欧美日韩精品在线| 91九色丨porny丨极品女神| 26uuu精品一区二区在线观看| 成年人网站av| 美女脱光内衣内裤视频久久影院| 777av视频| 欧美国产另类| 一区二区三区在线视频111| 欧美午夜寂寞| av日韩中文字幕| 日韩伦理一区二区| 国产xxx69麻豆国语对白| 成年人视频免费在线播放| 俺去啦;欧美日韩| 国产在线免费观看| 亚洲精品98久久久久久中文字幕| 国产日韩在线观看一区| 欧美手机在线视频| 天天干天天干天天操| 亚洲国产综合色| 国产高潮国产高潮久久久91| 中文字幕 久热精品 视频在线| 亚洲高清无码久久| 国产成人日日夜夜| 少妇丰满尤物大尺度写真| 久久国产日韩欧美精品| 日本免费观看网站| 老色鬼久久亚洲一区二区| 欧美a在线视频| 国产日韩免费| 九色在线视频观看| 亚洲每日更新| 亚洲中文字幕无码专区| 在线综合亚洲| 成人在线免费在线观看| 亚洲高清资源| 岛国大片在线播放| 亚洲性视频h| 九色自拍视频在线观看| 1000部精品久久久久久久久| 中文字幕无码精品亚洲资源网久久| 国内综合精品午夜久久资源| 日本人妻伦在线中文字幕| 综合日韩在线| 国产一级片91| 欧美精品日韩| 日韩人妻无码精品久久久不卡| 亚洲无线视频| 少妇高潮喷水在线观看| 亚洲欧美日韩国产综合精品二区| 免费看一级大黄情大片| 亚洲欧美日韩专区| av网站在线不卡| 精品在线亚洲视频| avtt中文字幕| 不卡视频一二三| 精品无码人妻一区| 欧美国产综合色视频| 自拍偷拍第9页| 曰韩精品一区二区| 国产无遮无挡120秒| 欧美午夜性色大片在线观看| 国产免费a视频| 在线播放欧美女士性生活| a级片在线播放| 亚洲成人黄色在线| 黄上黄在线观看| 久久视频在线播放| 51精品在线| 国产精品激情av电影在线观看| 成人国产一区| 99中文字幕| 国产成人一区二区三区影院| 在线综合视频网站| 亚洲东热激情| 污污视频网站免费观看| 国产另类ts人妖一区二区| 亚洲 欧美 日韩在线| 国产三级精品在线| 国产探花在线播放| 色婷婷av一区| 亚洲精品国偷拍自产在线观看蜜桃| 日韩成人网免费视频| 粉嫩一区二区三区国产精品| 欧美xxxx综合视频| 电影网一区二区| 亚洲精品免费网站| 偷窥自拍亚洲色图精选| 一本一道久久a久久精品综合| 亚洲欧美综合| 黄色成人免费看| 成人激情综合网站| 国产在线观看免费视频软件| 偷拍亚洲欧洲综合| 国产裸体无遮挡| 亚洲天堂久久av| gogo高清在线播放免费| 国产精品亚洲网站| 台湾佬综合网| 久久久天堂国产精品| 日韩国产精品久久| 青青草视频播放| 亚洲精品免费播放| 中文字幕乱码一区二区| 日韩成人中文字幕| 男女在线视频| 成人乱人伦精品视频在线观看| 日韩美女精品| www.国产在线视频| 国产在线精品不卡| аⅴ天堂中文在线网| 午夜精品福利视频网站| av天堂一区二区三区| 中文字幕少妇一区二区三区| 日本а中文在线天堂| 超碰97在线资源| 亚洲最大av| 日韩av自拍偷拍| 国产精品理伦片| 精品国产乱子伦| 亚洲欧美日韩天堂| 美女高潮在线观看| 国内视频一区二区| 亚洲一级高清| 人妻激情偷乱视频一区二区三区| 国产精品女主播av| 国产裸体美女永久免费无遮挡| 亚洲欧美日韩中文在线制服| 涩涩网在线视频| 国产一区二区三区高清| 极品av少妇一区二区| 极品白嫩的小少妇| 亚洲一区二区三区四区在线观看| 国产色在线视频| 免费不卡在线观看av| 99国内精品久久久久| 在线观看国产一区| 经典一区二区三区| 手机在线免费看毛片| 日韩女优av电影| 污网站在线免费看| 高清视频在线观看一区| 一区免费视频| 捆绑凌虐一区二区三区| 午夜欧美在线一二页| 午夜福利视频一区二区| 欧美一区二区三区精品电影| 亚洲黄页在线观看| 天美星空大象mv在线观看视频| 亚洲国产成人在线| 亚洲中文字幕一区二区| 久久中文字幕国产| 永久免费精品视频| 国产特级淫片高清视频| 久久伊99综合婷婷久久伊| 国产精品xxxxxx| 久久九九有精品国产23| 欧美欧美在线| 久艹视频在线免费观看| www亚洲一区| 最新中文字幕免费| 久久精品国产v日韩v亚洲| 视频一区日韩| 久久综合色视频| 国产三级一区二区| 国产免费的av| 91高清视频在线免费观看| 国产探花一区| 两性午夜免费视频| 精品国产精品三级精品av网址| 久久天堂电影| 成人做爽爽免费视频| 亚洲欧洲午夜| 成年人在线免费看片| 日韩一区二区三区视频| 秋霞伦理一区| 在线播放 亚洲| 成人深夜在线观看| 久久久久久无码午夜精品直播| 久久这里只有精品99| 亚洲国产最新| 国产黑丝在线视频| 色伊人久久综合中文字幕| 成人在线直播| 欧美久久久久久| 国产激情精品久久久第一区二区| 丁香六月婷婷综合| 久久天天躁狠狠躁夜夜av| 四虎影视精品| xxxxwww一片| 欧洲av一区二区嗯嗯嗯啊| 丰满大乳少妇在线观看网站| 日本精品二区| 成人国产视频在线观看| 一级黄色片免费看|