MyBatis的Batch處理致使秒殺系統超賣的問題

#1 問題描述# 2015-08-14 週五,線上樂購作活動,1元秒殺大閘蟹,庫存設置爲10 ,結果賣出去15個,而且線上存在髒數據,有些關聯表數據不全。mysql

執行原理:樂購調用訂單平臺下單,在訂單平臺調用促銷邏輯,在促銷邏輯中加限購邏輯。 #2 排查過程#spring

  1. 走查樂購秒殺的業務代碼實現,在高併發的狀況下,不會出現線程安全問題;【正常】
  2. 理解業務執行過程當中,事務調用流程:Spring事務=>MyBatis事務=>druid事務(數據源)=>DB事務(數據庫);【MyBatis的Batch處理致使上層Spring事務失效】
  3. 查看mysql binlog日誌,以下:【不正常】

輸入圖片說明

發現多個事務被合併成了一個事務執行,合併事務以後有啥問題?當合並事務以後,其中有一個事務執行失敗後,上層的Spring就沒法得知要回滾具體的哪個事務。 4. MyBatis的配置文件中,SqlSessionTemplate配置存在問題:【不正常】sql

輸入圖片說明

#3 解決問題#數據庫

  1. 註釋掉SqlSessionTemplate中BATCH的配置:

輸入圖片說明

#4 問題總結# Mybatis內置的ExecutorType有3種,默認的是simple,該模式下它爲每一個語句的執行建立一個新的預處理語句,單條提交sql;而batch模式重複使用已經預處理的語句,batch模式若是和原spring事務一塊兒使用,將沒法回滾。安全

相關文章
相關標籤/搜索