精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人网页在线免费观看| 亚洲欧美日韩爽爽影院| 奇米影视亚洲色图| 九色在线视频蝌蚪| 精久久久久久久久久久| 久久久亚洲成人| x88av在线| 涩爱av色老久久精品偷偷鲁 | 亚洲最新免费视频| 可以免费看毛片的网站| 视频一区国产视频| 欧美精品激情视频| 久久久免费看片| 成人精品毛片| 欧美电影影音先锋| 成人在线免费在线观看| 国产成人无吗| 欧美国产成人精品| 国产精品视频一区二区三区经| 日韩黄色一级视频| 精品av久久久久电影| 中文字幕亚洲天堂| 久久无码人妻精品一区二区三区 | 在线一区欧美| 久久亚洲国产精品成人av秋霞| 中文字幕在线观看网址| 国产色99精品9i| 欧美在线一区二区三区| 成人性免费视频| jizzjizz亚洲| 国产精品久久久久一区二区三区| 精品一区2区三区| 午夜精品久久久久久久96蜜桃| 国产精品久久久久久久久久久久久久久久 | 99国产**精品****| 亚洲天堂免费在线| 亚洲制服丝袜在线播放| 日韩精品成人在线观看| 欧美性猛交xxxxxx富婆| 国产亚洲精品网站| 国产夫妻在线| 午夜久久久久久| 欧美男生操女生| 国产精品久久7| 国产精品视频在线观看免费| 免费在线视频一区| 国产精品第10页| aaaaaa毛片| 米奇777在线欧美播放| 91超碰中文字幕久久精品| www.youjizz.com亚洲| 欧美国产精品| 欧美美女15p| 麻豆亚洲av熟女国产一区二| 欧美.www| 欧美激情在线一区| 精品无码人妻一区二区三区| 国产在线日韩| 久久久久久久久国产| 国产亚洲精品久久久久久无几年桃| 欧美国产另类| 性欧美办公室18xxxxhd| 久久不卡免费视频| 久久久久99| 国产精品扒开腿做爽爽爽视频| 国产suv精品一区二区33| 日韩专区中文字幕一区二区| 国产精品高潮呻吟视频| 伊人22222| 国产一区二区三区视频在线播放| 成人激情视频小说免费下载| 精品人妻无码一区二区色欲产成人| 国产精品一区二区无线| 国产精品一区视频网站| 天堂在线一二区| 日本一区二区三区四区在线视频 | 午夜国产精品一区| 丁香啪啪综合成人亚洲| 成人国产在线| 日韩精品自拍偷拍| 一出一进一爽一粗一大视频| 奇米狠狠一区二区三区| 久久精品国产96久久久香蕉| 国产大片aaa| 亚洲免费综合| 国产一区二区在线免费视频| 亚洲不卡免费视频| 91香蕉视频mp4| 亚洲一区三区视频在线观看| 日本高清在线观看视频| 色综合视频一区二区三区高清| jizzzz日本| 韩国精品福利一区二区三区| 国产午夜精品一区二区三区| 久久久久久久久久久久国产| 日韩电影免费在线看| 97伦理在线四区| 韩国福利在线| 亚洲图片欧美色图| 高清av免费看| 久久av国产紧身裤| 日日噜噜噜夜夜爽亚洲精品| 国产一级理论片| 日本aⅴ亚洲精品中文乱码| 亚洲xxx自由成熟| 国产午夜在线观看| 亚洲一二三专区| 天天色综合天天色| 希岛爱理av免费一区二区| 久久精品成人一区二区三区| 精品不卡一区二区| 丁香婷婷深情五月亚洲| 亚洲精品在线视频观看| 性欧美18xxxhd| 日韩精品最新网址| 欧美视频一区二区在线| 蜜桃视频一区| 精品亚洲第一| av老司机在线观看| 91精品国产美女浴室洗澡无遮挡| 亚洲精品午夜视频| 亚洲欧洲一区| 99久热re在线精品视频| 午夜免费福利在线观看| 色综合久久九月婷婷色综合| 亚洲中文字幕无码一区| 牛夜精品久久久久久久99黑人| 国产精品一区电影| 精品av中文字幕在线毛片| 亚洲成人在线免费| 中文字幕在线播放一区二区| 亚洲成av人片乱码色午夜| 国产经典一区二区| 久蕉在线视频| 色婷婷精品大在线视频| 91精品国产自产| 国产亚洲高清视频| 狠狠色噜噜狠狠狠狠色吗综合| 色yeye免费人成网站在线观看| 欧美精品第1页| 亚洲人与黑人屁股眼交| 美腿丝袜一区二区三区| 四虎永久在线精品免费一区二区| 中文字幕21页在线看| 亚洲精品国产品国语在线| 1级黄色大片儿| av福利精品导航| 亚洲色成人一区二区三区小说| 牛牛影视久久网| 91av中文字幕| 国产在线观看网站| 欧美视频一区二区三区在线观看 | 亚洲视频中文字幕| 红桃视频 国产| 午夜精品毛片| 91av一区二区三区| 日本乱理伦在线| 亚洲国产欧美久久| 国产www在线| 国产拍揄自揄精品视频麻豆| 91香蕉视频导航| 91精品久久久久久久蜜月| 99理论电影网| 午夜影院一区| 国产一区二区三区在线免费观看| 亚洲国产无线乱码在线观看| 综合在线观看色| 乱码一区二区三区| 亚洲一区二区三区高清不卡| 日韩高清av电影| 亚洲精品成a人ⅴ香蕉片| 欧美精品一本久久男人的天堂| 黄色av小说在线观看| 黄色成人在线播放| 性欧美精品男男| 国产揄拍国内精品对白| 91免费黄视频| av资源久久| 亚洲综合在线小说| 天堂√8在线中文| 日韩在线欧美在线国产在线| 国产成人精品亚洲精品色欲| 婷婷久久综合九色综合绿巨人| 国产熟妇久久777777| 黑人巨大精品欧美一区| 精品人妻少妇一区二区| re久久精品视频| av观看久久| 日韩制服一区| 欧美日韩高清区| 国模吧精品人体gogo| 欧美一区二区视频观看视频| 久久久国产高清| 亚洲柠檬福利资源导航| 美女久久久久久久久| 免费美女久久99| 国产日韩av网站| 国产精品久久久久久久久久10秀| 精品国产综合区久久久久久| 日韩一区二区三区四区五区| 91av在线播放| 亚洲卡一卡二| 中国日韩欧美久久久久久久久| 亚洲精品国产av| 欧美视频一区在线| 草久久免费视频| 亚洲激情男女视频| 成人无码精品1区2区3区免费看| 99精品一区二区| 国产999免费视频| 美女视频免费一区| 黄色片视频在线免费观看| 午夜欧美精品| 伊人久久大香线蕉午夜av| 网友自拍一区| 精品高清视频| 中文字幕一区二区三区中文字幕| 国产免费一区二区三区香蕉精| 色偷偷色偷偷色偷偷在线视频| 欧美大胆a视频| 日本视频在线观看| 亚洲偷欧美偷国内偷| 日韩中文字幕免费观看| 欧美一区二区精品久久911| 做爰无遮挡三级| 一本一道久久a久久精品综合蜜臀| 久久久精品99| 一区二区三区国产精品| h色网站在线观看| 国产精品久久久久久久久久久免费看| 美国黄色a级片| 91农村精品一区二区在线| 亚洲精品国产成人av在线| 成人一区二区视频| 免费观看一区二区三区| 国产成人av自拍| 日本wwww色| 国产99久久久国产精品潘金网站| 免费人成视频在线播放| 国产精品 欧美精品| 色婷婷综合在线观看| 国产一区二区调教| 亚洲综合伊人久久| 美国毛片一区二区| 青青草原国产在线视频| 久国产精品韩国三级视频| 一级做a免费视频| 极品美女销魂一区二区三区| 成人免费黄色av| 国产suv精品一区二区三区| 中文字幕永久免费| 成人激情小说网站| 你懂的在线观看网站| 91片在线免费观看| 黄色三级生活片| 中文字幕一区二区在线播放| 欧美 日韩 国产 一区二区三区| 亚洲欧美日韩系列| 久久免费视频精品| 精品久久久久久电影| av片免费观看| 欧美日本视频在线| 性少妇videosexfreexxx片| 精品久久久久99| 天堂√在线中文官网在线| 亚洲视频在线观看视频| 天堂а√在线资源在线| 欧美另类第一页| 免费毛片b在线观看| 国产成人免费91av在线| www999久久| 精品国产第一页| 国产中文字幕一区二区三区| 亚洲资源在线网| 欧美涩涩视频| 国产精品天天av精麻传媒| 精彩视频一区二区三区| 久草视频福利在线| 国产免费av一区二区三区| eeuss影院一区二区三区| 亚洲午夜色婷婷在线| 久章草在线视频| 少妇一级淫片日本| 99久久精品国产一区二区三区 | 成人午夜在线播放| 男女黄床上色视频| 1000部国产精品成人观看| 九九热国产在线| 在线看日韩精品电影| 成 人 黄 色 片 在线播放| 日韩精品丝袜在线| 老司机免费在线视频| 91精品国产免费久久久久久| 狂野欧美性猛交xxxx| 激情视频一区二区| 偷偷www综合久久久久久久| 热99这里只有精品| 国产在线一区观看| 丰满圆润老女人hd| 亚洲精选免费视频| 国产三级理论片| 亚洲精品国产精品久久清纯直播| 免费av网站在线看| 国产91免费看片| 国产在线播放精品| 中文字幕一区二区三区精彩视频 | 午夜av一区| 三级4级全黄60分钟| 国产999精品久久久久久绿帽| 欧美三级视频网站| 欧美日韩美女在线观看| 亚洲卡一卡二卡三| 久久久av免费| 国产精品麻豆成人av电影艾秋| 精品久久久久久亚洲| 欧美视频四区| 久久婷婷中文字幕| 中文字幕乱码日本亚洲一区二区| 可以免费看的av毛片| 精品国产一区二区三区久久影院| 欧美精品hd| 国产精品天天狠天天看| 国产精品嫩草影院在线看| 青青青青草视频| 成人福利在线看| 久久网一区二区| 欧美大肚乱孕交hd孕妇| 黄色动漫在线| 91精品视频免费观看| 色综合天天综合网中文字幕| 国产嫩草在线观看| 国产日韩欧美精品电影三级在线| 亚洲第一在线播放| 日韩电影在线观看永久视频免费网站| 黄色小说在线播放| αv一区二区三区| 狠狠干综合网| 日本久久久久久久久久| 夜夜操天天操亚洲| 亚洲免费不卡视频| 国内精品久久久久久久久| 久久aimee| 91精品91久久久中77777老牛| 99久久伊人网影院| 69视频免费在线观看| 亚洲女人初尝黑人巨大| 欧美极品免费| 日韩三级电影网站| 蜜桃久久久久久久| 天天爽天天爽天天爽| 91麻豆精品国产91久久久使用方法 | 国产一区视频观看| 亚洲毛片网站| 日韩 中文字幕| 欧美自拍偷拍一区| 日本三级在线播放完整版| 91久久久久久久久| 欧美日韩第一区| 精品一区二区三区四区五区六区| 偷拍亚洲欧洲综合| 久久天堂电影| 91精品国产综合久久香蕉的用户体验| 97久久视频| 色诱av手机版| 激情av一区二区| 国产免费av高清在线| 91色琪琪电影亚洲精品久久| 亚洲欧美综合| 美女爆乳18禁www久久久久久| 欧美午夜精品免费| 18视频在线观看| 久久精品ww人人做人人爽| 日韩电影在线免费看| 国产成人无码aa精品一区| 亚洲精品国产欧美| 国产亚洲欧美日韩精品一区二区三区 | 天堂在线一区二区| 日本精品在线免费观看| 精品国免费一区二区三区| 午夜伦理福利在线| 伊甸园精品99久久久久久| 国产馆精品极品| 日本视频在线观看免费| 久久手机精品视频| 欧美日韩直播| 国产欧美激情视频| 精品久久久久久中文字幕| 成人高清免费在线播放| 99视频国产精品免费观看| 日韩精品久久久久久| 国产一区二区视频在线观看免费| 精品丝袜一区二区三区| 伊人久久精品| 久久精品99国产| 亚洲精品日韩一| www视频在线观看免费| 亚洲一级黄色片| 国产乱了高清露脸对白| 国产一区二区三区站长工具| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 |