AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-10-13 14:36:35 353觀看
導讀環境:Spring5.3.23 Spring事務超時是指一個事務在執行中最長的允許時間。如果事務在超時時間內未能完成,則會自動回滾。超時時間可以通過設置來控制,以確保事務在規定的時間內完成或回滾,避免數據一致性問題。在工作中你

環境:Spring5.3.23hNE28資訊網——每日最新資訊28at.com

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

在工作中你有配置事務的超時時間嗎?如何進行配置事務超時時間?hNE28資訊網——每日最新資訊28at.com

1. 配置事務超時時間

注解方式:hNE28資訊網——每日最新資訊28at.com

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

編程方式1:hNE28資訊網——每日最新資訊28at.com

@Resourceprivate PlatformTransactionManager tm ;DefaultTransactionDefinition definition = new DefaultTransactionDefinition();definition.setTimeout(2) ;

編程方式2:hNE28資訊網——每日最新資訊28at.com

@Resourceprivate 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種方式讀可以進行事務超時的設置,什么情況下才能算是事務超時呢?hNE28資訊網——每日最新資訊28at.com

2. 準備環境

準備一張2000w數據的表hNE28資訊網——每日最新資訊28at.com

圖片圖片hNE28資訊網——每日最新資訊28at.com

表字段信息如下:hNE28資訊網——每日最新資訊28at.com

圖片圖片hNE28資訊網——每日最新資訊28at.com

此表除主鍵外沒有任何的索引。hNE28資訊網——每日最新資訊28at.com

圖片圖片hNE28資訊網——每日最新資訊28at.com

3. 模擬事務超時

  • 測試1

統計查詢表的數據量,將該操作放到一個事務中,同時設置事務的超時時間。hNE28資訊網——每日最新資訊28at.com

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

執行結果:hNE28資訊網——每日最新資訊28at.com

耗時:3198毫秒

接下來將超時時間改成3shNE28資訊網——每日最新資訊28at.com

執行結果如下:hNE28資訊網——每日最新資訊28at.com

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執行的超時,是由我們的驅動程序拋出的異常。hNE28資訊網——每日最新資訊28at.com

  • 測試2

模擬其它非數據庫操作耗時,而這個是在執行數據庫操作之前hNE28資訊網——每日最新資訊28at.com

@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) + "毫秒") ;}

執行結果:hNE28資訊網——每日最新資訊28at.com

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框架拋出的。hNE28資訊網——每日最新資訊28at.com

  • 測試3

模擬其它非數據庫操作耗時,而這個是在執行數據庫操作之后,適當調整上面的代碼順序hNE28資訊網——每日最新資訊28at.com

@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) + "毫秒") ;}

執行結果:hNE28資訊網——每日最新資訊28at.com

耗時:3015毫秒

程序正常運行hNE28資訊網——每日最新資訊28at.com

  • 測試4

在測試3的基礎上,最后再次執行數據庫相關的操作hNE28資訊網——每日最新資訊28at.com

@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") ;}

執行結果:hNE28資訊網——每日最新資訊28at.com

耗時: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)

第一個數據庫操作,沒有拋出異常,直到第二個執行時拋出了異常。hNE28資訊網——每日最新資訊28at.com

總結:      事務方法開始執行時就開始計時,在執行到數據庫操作時判斷當前的執行時間點是否已經超過了設置的超時時間,如果是則拋出Timeout異常。hNE28資訊網——每日最新資訊28at.com

4. 事務超時原理

在開始一個事務時會在DataSourceTransactionManager#doBegin方法中設置超時時間hNE28資訊網——每日最新資訊28at.com

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操作數據庫時,還會執行如下操作hNE28資訊網——每日最新資訊28at.com

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工具類hNE28資訊網——每日最新資訊28at.com

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類hNE28資訊網——每日最新資訊28at.com

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);    }  }}

完畢!!!hNE28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-13279-0.htmlSpring事務超時到底是怎么回事?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何搭建高性能廣告技術需求方平臺

下一篇: 程序員必會之最詳細的ThreadPoolExecutor 線程池七大參數含義

標簽:
  • 熱門焦點
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權無門的比比皆是。&ldquo;提供相關產品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應該選擇什么樣的著裝?&rdquo;近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一
  • 滴滴違法違規被罰80.26億 共存在16項違法事實

    滴滴違法違規被罰80.26億 存在16項違法事實開始于2121年7月,歷經一年時間,網絡安全審查辦公室對“滴滴出行”網絡安全審查終于有了一個暫時的結束。據“網信
Top