事務管理

来源:https://www.cnblogs.com/hhmm99/archive/2018/11/09/9934243.html
-Advertisement-
Play Games

什麼是事務 事務是現代資料庫的核心概念之一,它表示資料庫一系列操作的集合。這些操作必須在一個事務當中,要麼全部執行成功,要麼全部不執行。 ACID原則 原子性(Atomicity) 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失 ...


什麼是事務

事務是現代資料庫的核心概念之一,它表示資料庫一系列操作的集合。這些操作必須在一個事務當中,要麼全部執行成功,要麼全部不執行。

ACID原則

原子性(Atomicity)

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

一致性(Consistency)

一個事務執行之前和執行之後都必須處於一致性狀態。例如轉賬,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。

隔離性(Isolation)

隔離性是當多個用戶併發訪問資料庫時,比如操作同一張表時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。

持久性(Durability)

持久性是指一個事務一旦被提交了,那麼對資料庫中的數據的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

Java事務類型

JDBC事務

JDBC事務也稱之為本地事務,主要是利用Connection對象控制,可以將多個SQL語句操作放在一個事務中執行。Connection介面提供了兩種事務管理的方式:自動提交和手動提交。但是JDBC事務的一個缺點就是事務範圍局限於一個資料庫連接中,並不能誇多個資料庫。

JTA事務

JTA(Java Transaction API)是Java中的事務標準PAI,它與實現和協議無關,應用程式和應用伺服器之間可以使用JTA來操作事務。JTA事務允許應用程式同時操作多個不同的資料庫,這些資料庫可以分佈在不同的網路中,這就是所謂的分散式事務處理。而大部分資料庫的JDBC驅動都會支持這種分散式事務處理(通常都會實現XADataSource與XAConnection)。

容器事務(CMT)

容器事務主要由J2EE應用伺服器提供,通常指的是EJB容器,這些容器事務大多基於JTA事務來實現。相對於編碼來實現JTA事務管理,我們可以通過容器提供的事務管理機制來完成相同的功能。這樣我們不必以硬編碼的方式來控制事務,完全由容器托管,我們只需簡單的指定哪些方法需要加入事務,一旦指定,容器將負責事務的管理。

Spring事務管理

編程式事務

所謂編程式指的是在程式中以編碼的方式使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate。

聲明式事務

聲明式事務是建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式管理事務,只需要在配置文件中做相應的配置或者使用註解進行事務聲明即可。

事務傳播性

事務的傳播性一般在事務嵌套時候使用,比如在事務A裡面調用了另外一個使用事務的方法,那麼這倆個事務是各自作為獨立的事務執行提交,還是內層的事務合併到外層的事務一塊提交,這就是事務傳播性要確定的問題。

REQUIRED

業務方法需要在一個事務中運行。如果方法運行時,已經處在一個事務中,那麼這個時候就會加入到該事務中,如果當前沒有事務環境的話,就會為自己創建一個新的事務。

(如果存在一個事務,則支持當前事務。如果沒有事務則開啟)

SUPPORTS

如果業務方法A在某個事務範圍內被調用,則方法成為事務的一部分。如果業務方法在事務範圍外被調用,則方法在沒有事務的環境下執行。即當標註了事務傳播屬性——SUPPORTS的業務方法在另一個bean的業務方法中執行時,如果另一個bean的業務方法開啟了事務,它就會處在事務中執行,如果另一個bean的業務方法也沒開啟事務,那麼它也在沒有事務的環境中進行。

(如果存在一個事務,則支持當前事務。如果沒有事務,則非事務的執行)

MANDATORY

該屬性指定業務方法只能在一個已經存在的事務中執行,業務方法不能發起自己的事務。如果業務方法在沒有事務的環境下調用,容器就會拋出異常。一種比較強硬的方式。

(如果存在一個事務,則支持當前事務。如果沒有一個活動的事務,則拋出異常)

REQUIRES_NEW

該屬性表明不管當前是否存在事務,業務方法總會為自己發起一個新的事務。如果方法已經運行在一個事務中,則原有事務會被掛起,新的事務會被創建,直到方法執行結束,新事務才算結束,原先的事務才會恢復執行。

( 總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起)

NOT_SUPPORTED

聲明方法不需要事務。如果方法沒有關聯到一個事務,容器不會為它開啟事務。如果方法在一個事務中被調用(在其他業務bean的方法中被調用了,而其他業務bean的方法是開啟了事務的),該事務會被掛起,在方法調用結束後,原先的事務便會恢復執行。

(總是非事務地執行,並掛起任何存在的事務)

NEVER

指定業務方法絕對不能在事務範圍內執行。如果業務方法在某個事務中執行,容器會拋出異常,只有業務方法沒有關聯到任何事務,才能正常執行。比較強硬的方式,就是不支持事務。

(總是非事務地執行,如果存在一個活動事務,則拋出異常)

NESTED

(嵌套事務)如果一個活動的事務存在,則當前方法運行在一個嵌套的事務中。 如果沒有活動事務,就創建一個新的事務。它使用了一個單獨的事務,這個事務擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。外部事務回滾會導致內部事務的回滾。如果被調用的內部方法沒有捕獲異常,跑出異常也會導致外部事務的回滾。

(如果一個活動的事務存在,則運行在一個嵌套的事務中。 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行 Spring事務的隔離級別)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.概述 在mysql 5.5之前,mysql 的複製是非同步操作,主庫和從庫的數據之間存在一定的延時,這樣存在一個隱患:當主庫上寫入一個事務並提交成功,而從庫尚未得到主庫推送的Binlog日誌時,主庫down機了,事務Binlog丟失了,此時從庫就缺失了這個事務,從而造成主從不一致。 為瞭解決這個問 ...
  • 驗證結果: 寫作時間:2017-11-8 本文只代表本人的見解,可能存在錯誤,僅用於技術交流。如果你喜歡該文,可以掃下麵的二維碼打賞我(打賞敬請備註“博客園打賞”五字)。 ...
  • 轉自 https://www.cnblogs.com/guanjie20/archive/2013/02/17/2914488.html 我們在寫事務時經常遇到的問題如下: 消息 266,級別 16,狀態 2,過程 sp1,第 0 行 EXECUTE 後的事務計數指示 BEGIN 和 COMMIT  ...
  • 為什麼plsql的database下拉為空?我在tnsnames.ora中設置了字元串ORCL,疑惑了我好久,在網上找了許久解決方案,終於是解決了!如下對我的解決過程做一個記錄。 ...
  • 機房意外斷電斷網不得不預防,下麵模擬測試某機房斷電斷網,B機房斷電斷網後A機房可正常提供服務,A機房斷電斷網後可能需要強制重啟繼續提供服務了,目前查看數據都還在,暫時沒驗證是否有數據丟失,小試了一把。。。大概架構A機房192.168.70.214:27017 (為primary,其他節點都是SECO ...
  • 每個人都在說大數據,但是大數據到底是什麼?很多人都沒有搞清楚。所以大數據學習要學什麼知識自然就不是非常清楚了。 什麼是大數據?其實從字面意義上講,我們就可以進行簡單的瞭解,大數據就是大的數據,也可以稱之為海量數據或巨量數據。大數據相對的就是小數據或者普通數據,大數據與小數據或平臺數據的區別在哪裡呢? ...
  • 鎖概述 MySQL的鎖機制,就是資料庫為了保證數據的一致性而設計的面對併發場景的一種規則。 最顯著的特點是不同的存儲引擎支持不同的鎖機制,InnoDB支持行鎖和表鎖,MyISAM支持表鎖。 表鎖就是把整張表鎖起來,特點是加鎖快,開銷小,不會出現死鎖,鎖粒度大,發生鎖衝突的概率高,併發相對較低。 行鎖 ...
  • mysql資料庫連接異常問題(總結) 1.1 前言 最近項目由1個數據源增加至了3個數據源(連接池使用C3P0),結果各種奇葩的資料庫連接問題接踵而至,為防止將來再次遇到同樣的問題不犯同樣錯誤,現總結如下。 1.2 An attempt by a client to checkout a Conne ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...