最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring強大事務(wù)兼容數(shù)據(jù)庫多種組合解決業(yè)務(wù)需求

 更新時間:2022年07月25日 14:52:21   作者:zxhtom  
這篇文章主要為大家介紹了Spring強大事務(wù)兼容數(shù)據(jù)庫多種組合解決業(yè)務(wù)需求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

事物的由來

在mysql中只有innodb存儲引擎才支持事物,所以我們后續(xù)都是基于innodb來展開的

事物特性

事物是用來保證數(shù)據(jù)的完整性的,保證批量sql執(zhí)行的統(tǒng)一性;事物具有四個特性: A(Atomicity)、C(Consistency)、I(Isolation)、D(Durability)

原子性

一個事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。

一致性

在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預(yù)定的工作。

隔離性

數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。

持久性

事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。

基于四個特性,我們就需要在數(shù)據(jù)和性能進行權(quán)衡,需要比較下場景。在m y s q l中就存在四種隔離級別。事務(wù)隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。

隔離級別臟讀(Dirty Read)不可重復(fù)讀(NonRepeatable Read)幻讀(Phantom Read)
未提交讀(Read uncommitted)可能可能可能
已提交讀(Read committed)不可能可能可能
可重復(fù)讀(Repeatable read)不可能不可能可能
可串行化(Serializable )不可能不可能不可能
  • 之前我一直錯誤的認為mysql中默認的是讀已提交。后來查閱資料才知道默認的是可重復(fù)讀隔離級別。

什么事臟讀、不可重復(fù)讀、幻讀

上面提到了三種異常數(shù)據(jù)情況,作為一名合格的程序員我們需要知道不同的隔離級別會給我們造成具體什么樣的傷害。

臟讀

臟讀指的是A事物在操作數(shù)據(jù),還未進行提交此時B事物就已經(jīng)感知到數(shù)據(jù)的變化了。這是我們最不能接受的。這里以個人舉例,大學(xué)期間看中一款手機但是囊中羞澀需要爸媽支援下,打電話讓爸媽賺錢這里我們理解成A事物,我著急用錢我是B事物,此時A事物向zxh這張表新增了money=5000元的一條數(shù)據(jù)。B事物在修改zxh這張表中money這個字段。如果我們是讀未提交隔離級別。那么A事物剛新增完事物還未提交,B事物卻已經(jīng)可以修改了。那么B事物修改成功后就結(jié)束了。這個時候如果A事物因為別的原因出現(xiàn)異常了。那么就需要將add的5000進行回滾,回滾后余額出現(xiàn)負數(shù)。這個負數(shù)對于銀行來說就是壞賬。

#### 不可重復(fù)讀

-   顧名思義就是同一條數(shù)據(jù)多次讀取并不能保證數(shù)據(jù)一致性。這是因為A事物第一次讀完數(shù)據(jù)后B事物修改了相同的數(shù)據(jù)行。那么A事物在此讀取該數(shù)據(jù)就會發(fā)生不可重復(fù)讀。

#### 幻讀

-   不可重復(fù)讀是針對同一條數(shù)據(jù)內(nèi)容的變化。而幻讀針對的是表記錄的變化。還是A事物第一次查詢數(shù)據(jù)匹配到10條,第二次相同條件匹配到的是20條。這就是幻讀。
復(fù)制代碼

查詢

s q l功能
select @@tx_isolation;查詢數(shù)據(jù)庫默認隔離級別
select @@global.tx_isolation;查看系統(tǒng)當(dāng)前隔離級別
set session transaction isolation level repeatable read;設(shè)置當(dāng)前會話隔離級別
set global transaction isolation level repeatable read;設(shè)置系統(tǒng)當(dāng)前隔離級別
  • mysql 四種隔離級別對應(yīng)關(guān)系 ; 設(shè)置時候去掉破折號就行了

REPEATABLE-READ

READ-COMMITTED

READ-UNCOMMITTED

SERIALIZABLE

  • 我們也可以通過show來查看相關(guān)配置
show variables like '%iso%';

spring事物

 @Override
 public Map<String, Object> startTransaction(Transmodel transmodel) {
   int insert = transMapper.insert(transmodel);
   log.info("操作日志:" + insert);
   if ("zxhtom".equals(transmodel.getName())) {
     throw new RuntimeException("error");
   }
   return new HashMap<>();
 }
復(fù)制代碼
  • 上面代碼邏輯非常的簡單,當(dāng)我們傳送如下參數(shù)時就會報錯
   {
     "name": "zxhtom",
     "code": "56",
     "age": 34
 }
復(fù)制代碼
  • 但是呢?我們再去數(shù)據(jù)庫查看,發(fā)現(xiàn)該數(shù)據(jù)進入數(shù)據(jù)庫了。

  • 發(fā)生這種場景時不行的,在互聯(lián)網(wǎng)中我們要求部分接口必須具有原子性,中途報錯之前所有的操作就必須回滾。如果我們自己使用jdbc那么直接通過連接對象rollback就行了。
  • 在spring中因為連接session對接管了,我們就不必那么麻煩了,直接通過@Transactional標(biāo)注我們的方法就可以實現(xiàn)事物了。
 @Transactional
 public Map<String, Object> startTransaction(Transmodel transmodel) {
   int insert = transMapper.insert(transmodel);
   log.info("操作日志:" + insert);
   if ("zxhtom".equals(transmodel.getName())) {
     throw new RuntimeException("error");
   }
   return new HashMap<>();
 }
復(fù)制代碼
  • 在此執(zhí)行就會發(fā)現(xiàn),數(shù)據(jù)并沒有新增,這就是我們想要的效果

spring事物有哪些可配項

  • 里面有幾個屬性我們需要關(guān)注下。已經(jīng)圈出來了。

字段作用
value事物管理器;用于提交和回滾的功能;默認的DataSourceTransactionManager內(nèi)部時datasource來操作提交回滾的
transactionManager事物管理器;用于提交和回滾的功能;默認的DataSourceTransactionManager內(nèi)部時datasource來操作提交回滾的
propagation傳播屬性;spring中方法內(nèi)方法事物傳遞屬性設(shè)置
isolation隔離級別,在數(shù)據(jù)庫基礎(chǔ)上新增一個默認以數(shù)據(jù)庫隔離級別為準
timeout超時事物不提交
readOnly這個感覺沒啥意義,被標(biāo)注的方法無法執(zhí)行更新操作,只能select
rollbackFor導(dǎo)致事務(wù)回滾的異常類數(shù)組
rollbackForClassName導(dǎo)致事務(wù)回滾的異常類名字數(shù)組
noRollbackFor不會導(dǎo)致事務(wù)回滾的異常類數(shù)組
noRollbackForClassName不會導(dǎo)致事務(wù)回滾的異常類名字數(shù)組

傳播屬性

  • 傳播屬性spring為我們建立了枚舉
 public enum Propagation {
   REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
   SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
   MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
   REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
   NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
   NEVER(TransactionDefinition.PROPAGATION_NEVER),
   NESTED(TransactionDefinition.PROPAGATION_NESTED);
   private final int value;
   Propagation(int value) {
     this.value = value;
   }
   public int value() {
     return this.value;
   }
 }

以上就是Spring強大事務(wù)兼容數(shù)據(jù)庫多種組合解決業(yè)務(wù)需求的詳細內(nèi)容,更多關(guān)于Spring事務(wù)解決業(yè)務(wù)需求的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring?boot?easyexcel?實現(xiàn)復(fù)合數(shù)據(jù)導(dǎo)出、按模塊導(dǎo)出功能

    Spring?boot?easyexcel?實現(xiàn)復(fù)合數(shù)據(jù)導(dǎo)出、按模塊導(dǎo)出功能

    這篇文章主要介紹了Spring?boot?easyexcel?實現(xiàn)復(fù)合數(shù)據(jù)導(dǎo)出、按模塊導(dǎo)出,實現(xiàn)思路流程是準備一個導(dǎo)出基礎(chǔ)填充模板,默認填充key,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • 詳解Spring MVC4 純注解配置教程

    詳解Spring MVC4 純注解配置教程

    本篇文章主要介紹了Spring MVC4 純注解配置教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Lucene?索引刪除策略源碼解析

    Lucene?索引刪除策略源碼解析

    這篇文章主要為大家介紹了Lucene?索引刪除策略源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • JAVA刪除字符串固定下標(biāo)字串的實現(xiàn)

    JAVA刪除字符串固定下標(biāo)字串的實現(xiàn)

    本文主要介紹了JAVA刪除字符串固定下標(biāo)字串的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Quarkus集成apollo配置中心

    Quarkus集成apollo配置中心

    這篇文章主要介紹了Quarkus集成apollo配置中心,文中詳細的講解了Quarkus的config構(gòu)成,以及apollo集成實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • JAVA簡單分組的算法實現(xiàn)

    JAVA簡單分組的算法實現(xiàn)

    本文介紹了“JAVA簡單分組的算法實現(xiàn)”,需要的朋友可以參考一下
    2013-03-03
  • Spring AI 使用本地 Ollama Embeddings的操作方法

    Spring AI 使用本地 Ollama Embeddings的操作方法

    使用 OpenAI 的 Embeddings 接口是有費用的,如果想對大量文檔進行測試,使用本地部署的 Embeddings 就能省去大量的費用,所以我們嘗試使用本地的 Ollama Embeddings,這篇文章主要介紹了Spring AI 使用本地 Ollama Embeddings,需要的朋友可以參考下
    2024-05-05
  • Java獲取磁盤空間的兩種代碼示例

    Java獲取磁盤空間的兩種代碼示例

    這篇文章主要介紹了Java獲取磁盤空間的兩種代碼示例,沒什么事的時候可以拿來玩玩,需要的朋友參考下。
    2017-11-11
  • 詳解java如何處理各種批量數(shù)據(jù)入庫

    詳解java如何處理各種批量數(shù)據(jù)入庫

    這篇文章主要為大家詳細介紹了java如何使用BlockingQueue處理各種批量數(shù)據(jù)入庫,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • MyBatis自定義TypeHandler實現(xiàn)字段加密解密

    MyBatis自定義TypeHandler實現(xiàn)字段加密解密

    本文主要介紹了MyBatis自定義TypeHandler實現(xiàn)字段加密解密,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03

最新評論

凤翔县| 宜宾县| 门源| 安仁县| 鄂托克旗| 永城市| 安龙县| 龙海市| 石首市| 乌兰浩特市| 信宜市| 沙雅县| 疏勒县| 外汇| 乌什县| 清徐县| 肇东市| 布拖县| 工布江达县| 大埔县| 西和县| 化隆| 行唐县| 和林格尔县| 平和县| 安平县| 临夏市| 通海县| 浙江省| 德阳市| 高青县| 若羌县| 凌源市| 体育| 平陆县| 滕州市| 定兴县| 筠连县| 玛纳斯县| 翼城县| 从化市|