本地事務簡介

本地事務簡介

1 事務基本性質

數據庫事務的幾個特性:原子性(Automicity)、一致性(Consistency)、隔離性或獨立性(islation)和持久性(Durability),簡稱ACID。

  • 原子性:一系列的操作,其整體不可拆分,要么同時成功,要么同時失敗。

  • 一致性:數據在事務的前后,業務整體一致。

    • 轉賬 。A:1000; B:1000 ;轉200
      事務成功。 A:800, B:1200
  • 隔離性:事務之間互相隔離。

  • 持久性:一旦事務成功,數據一定會記錄在數據庫。

2 事務的隔離級別
隔離級別特點
Read Uncommitted允許讀取未提交的數據
Read committed只能讀取已提交的數據
Repeatable Read同一事務中多次讀取同一數據結果一致
Serializable事務完全串行化,按順序執行
2.1 Read Uncommitted
場景描述

假設有一個銀行賬戶表 accounts,記錄用戶的賬戶余額。現在有兩個并發事務:

  1. 事務 A:從賬戶中扣除 100 元。
  2. 事務 B:查詢賬戶余額。
數據庫初始狀態

假設賬戶初始余額為 1000 元。

事務操作步驟
  1. 事務 A 開始
    • 查詢賬戶余額:SELECT balance FROM accounts WHERE account_id = 1;(結果為 1000 元)
    • 扣除 100 元:UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;(此時賬戶余額變為 900 元,但事務 A 還未提交)
  2. 事務 B 開始
    • 查詢賬戶余額:SELECT balance FROM accounts WHERE account_id = 1;(結果為 900 元,因為事務 A 的未提交數據被讀取到了)
  3. 事務 A 回滾
    • 由于某些原因,事務 A 回滾,撤銷了之前的更新操作。此時賬戶余額恢復為 1000 元。
  4. 事務 B 結束
    • 事務 B 查詢到的余額是 900 元,但實際上賬戶的真實余額是 1000 元。
問題分析
  • 臟讀:事務 B 讀取到了事務 A 未提交的數據(900 元),而事務 A 最終回滾,導致事務 B 查詢到的數據是不正確的。這種現象稱為臟讀
Read Uncommitted 的特點
  • Read Uncommitted 隔離級別下,事務可以讀取到其他事務尚未提交的數據。
  • 這種隔離級別允許并發性能最高,但數據一致性最差,容易出現臟讀問題。
2.2 Read Committed
場景描述

假設有一個庫存表 inventory,記錄商品的數量。現在有兩個并發事務:

  1. 事務 A:更新商品的數量。
  2. 事務 B:查詢商品的數量。
數據庫初始狀態

假設商品的初始數量為 100。

事務操作步驟
  1. 事務 A 開始
    • 查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果為 100)
    • 更新商品數量:UPDATE inventory SET quantity = quantity - 10 WHERE product_id = 1;(此時商品數量變為 90,但事務 A 還未提交)
  2. 事務 B 開始
    • 查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果為 100,因為事務 A 的更新尚未提交)
  3. 事務 A 提交
    • 提交事務 A,更新操作生效,商品數量變為 90。
  4. 事務 B 再次查詢
    • 再次查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果為 90,因為事務 A 已提交)
問題分析
  • 避免臟讀:事務 B 在事務 A 提交之前查詢到的商品數量是 100,而不是事務 A 未提交的 90。這避免了臟讀問題。
  • 不可重復讀:事務 B 在事務 A 提交后再次查詢,結果從 100 變為 90。這種現象稱為不可重復讀,因為同一個事務在不同時間讀取到的數據不一致。
  • 幻讀:如果事務 B 在事務 A 提交之前查詢商品數量,然后事務 A 插入了一條新的商品記錄,事務 B 再次查詢時可能會發現多了一條記錄。這種現象稱為幻讀
Read Committed 的特點
  • 避免臟讀:事務只能讀取到其他事務已經提交的數據。
  • 可能出現不可重復讀和幻讀:由于事務 B 在事務 A 提交前后讀取到的數據不一致,可能會出現不可重復讀和幻讀問題。
  • 并發性能較好:相比更高隔離級別(如 Repeatable ReadSerializable),Read Committed 的并發性能更好,因為它允許更多的并發操作。
2.3 Repeatable Read
場景描述

假設有一個商品庫存表 inventory,記錄商品的數量。現在有兩個并發事務:

  1. 事務 A:查詢并更新商品的數量。
  2. 事務 B:查詢商品的數量。
數據庫初始狀態

假設商品的初始數量為 100。

事務操作步驟
  1. 事務 A 開始
    • 查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果為 100)
    • 更新商品數量:UPDATE inventory SET quantity = quantity - 10 WHERE product_id = 1;(此時商品數量變為 90,但事務 A 還未提交)
  2. 事務 B 開始
    • 查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果為 100,因為事務 A 的更新尚未提交)
  3. 事務 A 提交
    • 提交事務 A,更新操作生效,商品數量變為 90。
  4. 事務 B 再次查詢
    • 再次查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果仍為 100,因為事務 B 在同一個事務中,讀取到的結果是一致的)
問題分析
  • 避免臟讀:事務 B 在事務 A 提交之前查詢到的商品數量是 100,而不是事務 A 未提交的 90。這避免了臟讀問題。
  • 避免不可重復讀:事務 B 在同一個事務中多次查詢商品數量,結果始終為 100,即使事務 A 已提交,事務 B 仍然讀取到的是事務開始時的一致數據。這避免了不可重復讀問題。
  • 可能出現幻讀:雖然 Repeatable Read 避免了不可重復讀,但在某些數據庫實現中,如果事務 A 插入或刪除了記錄,事務 B 可能會看到不同的結果集。這種現象稱為幻讀
Repeatable Read 的特點
  • 避免臟讀和不可重復讀:事務在同一個事務中多次讀取同一數據的結果是一致的。
  • 可能出現幻讀:在某些數據庫實現中,如果事務 A 插入或刪除了記錄,事務 B 可能會看到不同的結果集。
  • 并發性能較好:相比 SerializableRepeatable Read 的并發性能更好,因為它允許更多的并發操作。
2.4 Serializable
場景描述

假設有一個商品庫存表 inventory,記錄商品的數量。現在有兩個并發事務:

  1. 事務 A:查詢并更新商品的數量。
  2. 事務 B:查詢商品的數量。
數據庫初始狀態

假設商品的初始數量為 100。

事務操作步驟
  1. 事務 A 開始
    • 查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果為 100)
    • 更新商品數量:UPDATE inventory SET quantity = quantity - 10 WHERE product_id = 1;(此時商品數量變為 90,但事務 A 還未提交)
  2. 事務 B 開始
    • 查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(事務 B 會被阻塞,直到事務 A 提交或回滾)
  3. 事務 A 提交
    • 提交事務 A,更新操作生效,商品數量變為 90。
  4. 事務 B 繼續執行
    • 查詢商品數量:SELECT quantity FROM inventory WHERE product_id = 1;(結果為 90,因為事務 A 已提交)
問題分析
  • 避免臟讀:事務 B 在事務 A 提交之前無法讀取數據,因此不會讀取到事務 A 未提交的數據。
  • 避免不可重復讀:事務 B 在同一個事務中多次查詢商品數量,結果始終為 90,即使事務 A 已提交,事務 B 仍然讀取到的是事務開始時的一致數據。
  • 避免幻讀:事務 B 在事務 A 提交之前無法讀取數據,因此不會看到事務 A 插入或刪除的記錄。
Serializable 的特點
  • 完全避免并發問題Serializable 確保所有事務按順序執行,完全避免了臟讀、不可重復讀和幻讀。
  • 并發性能最低:由于事務必須按順序執行,不能并行,因此并發性能最低。
  • 適用場景:適用于對數據一致性要求極高的場景,如金融交易系統、賬務系統等。
3 事務的傳播行為

在 Spring 中,事務傳播行為(Transaction Propagation Behavior)定義了在一個事務中調用另一個事務方法時,事務如何被傳播和管理。Spring 提供了多種事務傳播行為,每種行為都對應不同的事務管理策略。以下是常見的事務傳播行為及其解釋:

傳播行為當前有事務時當前無事務時
PROPAGATION_REQUIRED加入當前事務創建新事務
PROPAGATION_SUPPORTS加入當前事務非事務執行
PROPAGATION_MANDATORY加入當前事務拋出異常
PROPAGATION_REQUIRES_NEW創建新事務,掛起當前事務創建新事務
PROPAGATION_NOT_SUPPORTED掛起當前事務,非事務執行非事務執行
PROPAGATION_NEVER拋出異常非事務執行
PROPAGATION_NESTED創建嵌套事務創建新事務

實例代碼:

#在注解上指定事務的傳播行為
@Transational(Propagation=Propagation.REQUIRES_NEWS)
#方法簽名
public void transaction(){...}
4 代理對象

在同一個類中,編寫兩個方法,內部調用的時候,會導致事務設置失效。原因是沒有用到代理對象。

// TODO ps:貌似新版spring已經優化了,可以內部調用了。

解決方法:通過代理對象調用方法

①引入依賴

<dependency><groupId>org.springframe.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

②在啟動類上加上注解@EnableAspectJAutoProxy(exposeProxy=true)

@EnableAspectJAutoProxy(exposeProxy=true)
@SpringBootApplication
public class Application {...}

③在類中使用代理對象如下:

OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
// 在OrderServiceImpl類內部,通過代理對象調用自身的method1方法和method2方法
orderService.method1();
orderService.method2();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895724.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyQt組態軟件 拖拽設計界面測試

PyQt組態軟件測試 最近在研究PyQt,嘗試寫個拖拽設計界面的組態軟件&#xff0c;目前實現的功能如下&#xff1a; 支持拖入控件&#xff0c;鼠標拖動控件位置 拖動控件邊緣修改控件大小支持屬性編輯器&#xff0c;修改當前選中控件的屬性 拖動框選控件&#xff0c;點選控件 控…

軟件評測師復習之計算機網絡(4)

目錄 (一)1.網絡功能和分類2.OSI七層模型3.TCP/IP協議4.傳輸介質(二)1.通信方式和交換方式2.IP地址3.IPv64.網絡規劃與設計5.磁盤冗余陣列6.網絡存儲技術(一) 1.網絡功能和分類 計算機網絡功能:數據通信、資源共享、負載均衡、高可靠性 按分布范圍和拓撲結構劃分: 網絡分類…

機器學習-1:線性回歸

常用的線性回歸模型主要有以下這些 簡單線性回歸多元線性回歸多項式回歸嶺回歸套索回歸彈性網絡回歸逐步回歸 一.簡單的一元線性回歸 1.導入必備的庫 #導入必備的庫 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …

SQL SERVER的PARTITION BY應用場景

SQL SERVER的PARTITION BY關鍵字說明介紹 PARTITION BY關鍵字介紹具體使用場景排名計算累計求和分組求最值分組內百分比計算分組內移動平均計算分組內數據分布統計分組內數據偏移計算 總結 PARTITION BY關鍵字介紹 在SQL SERVER中&#xff0c;關鍵字PARTITION BY主要用于窗口函…

NO.18十六屆藍橋杯備戰|循環嵌套|乘法表|斐波那契|質數|水仙花數|(C++)

循環嵌套 循環嵌套的使? while &#xff0c; do while &#xff0c; for &#xff0c;這三種循環往往會嵌套在?起才能更好的解決問題&#xff0c;就是我們所說的&#xff1a;循環嵌套。這三種循環都可以任意嵌套使? ?如&#xff1a; 寫?個代碼&#xff0c;打印?個乘法?…

leetcode - hot100 - python - 專題一:哈希

1、兩數之和 簡單 題目&#xff1a; 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。你可以假設每種輸入只會對應一個答案&#xff0c;并且你不能使用兩次相同的元素。你可…

JavaEE-SpringBoot快速入門

文章目錄 本節目標Maven什么是Maven創建一個Maven項目maven項目功能maven的依賴管理全球倉庫, 私服, 本地服務器, 配置國內鏡像 第一個SpringBoot項目創建項目運行SpringBoot程序 SpringBoot原理初步Web服務器 總結 本節目標 了解什么是maven, 配置國內源使用Springboot創建項…

【Viper】配置格式與支持的數據源與go案例

Viper 是一個用于 Go 應用程序的配置管理庫&#xff0c;支持多種配置格式和數據源。 安裝依賴 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要寫在etcd客戶端import里 1…

【C/C++】后綴表達式 藍橋杯/ACM備賽

核心考點&#xff1a;1.棧的應用 2.字符串處理 題目描述 所謂后綴表達式是指這樣的一個表達式&#xff1a;式中不再引用括號&#xff0c;運算符號放在兩個運算對象之后&#xff0c;所有計算按運算符號出現的順序&#xff0c;嚴格地由左而右新進行&#xff08;不用考慮運算符的…

【AI實踐】deepseek支持升級git

當前Windows 11 WSL的git是2.17&#xff0c;Android Studio提示需要升級到2.19版本 網上找到指導文章 安裝git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…

QEMU 搭建 Ubuntu x86 虛擬機

1. 安裝 QEMU 在 Ubuntu 系統中&#xff0c;可以通過以下命令安裝 QEMU&#xff1a; sudo apt-get update sudo apt-get install qemu-system-x86_64 qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager2. 創建虛擬硬盤鏡像 qemu-img create -f raw ubuntu…

Linux驅動層學習:Linux 設備樹

設備樹是一種數據結構&#xff0c;包含多個節點&#xff0c;用于描述硬件設備及其配置信息&#xff0c;它通常用于嵌入式系統中&#xff0c;尤其是在Linux操作系統中&#xff0c;幫助操作系統識別和管理硬件資源&#xff0c;設備樹不是代碼&#xff0c;而是一種用數據描述硬件信…

金蝶云星空與釘釘高效數據集成案例分享

金蝶云星空數據集成到釘釘的技術案例分享 在企業信息化系統中&#xff0c;數據的高效流動和實時反饋是提升業務效率的關鍵。本文將聚焦于一個具體的系統對接集成案例&#xff1a;如何將金蝶云星空的數據集成到釘釘&#xff0c;并實現審核狀態的回傳提示。 本次集成方案名為“…

圖形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan簡介

1.Skia —— 2D 圖形庫 Skia 是一個 2D 圖形庫&#xff0c;它的作用是為開發者提供一個高層次的繪圖接口&#xff0c;方便他們進行 2D 圖形渲染&#xff08;比如繪制文本、形狀、圖像等&#xff09;。Skia 本身不直接管理 GPU 或進行底層的渲染工作&#xff0c;而是通過 底層圖…

GIT提錯分支,回滾提交

1. 準備示例 假設我們有三次提交&#xff1a; test1&#xff1a;需要在 master 分支提交test2、test3&#xff1a;需要在 develop 分支提交 遠端線上記錄 2. 步驟 選擇需要回退的記錄&#xff1a; 選中需要回退的 commit&#xff0c;選擇 Reset Current Branch to Here...。…

【原創】在ubuntu中搭建gradle開發環境

檢查Linux版本 rootwww:~# hostnamectlStatic hostname: www.0x88.comIcon name: computer-vmChassis: vmMachine ID: 30fa955a36be492ca459599ef20bc508Boot ID: 37084dbe36f44adaa075e8f9a98f132eVirtualization: kvm Operating System: Ubuntu 22.04.5 LTSKernel: Linux 5.…

【JavaEE進階】MyBatis入門

目錄 &#x1f334;前言 &#x1f332;什么是MyBatis? &#x1f333;準備工作 &#x1f6a9;創建工程 &#x1f6a9;配置數據庫連接字符串 &#x1f6a9;數據準備 &#x1f6a9;編寫持久層代碼 &#x1f343;單元測試 &#x1f334;前言 在應?分層學習時,我們了解到…

以太網詳解(八)傳輸層協議:TCP/UDP 協議

文章目錄 傳輸層協議概述為什么需要傳輸層&#xff1f;傳輸層功能網絡層與傳輸層在實現 “端到端” 傳輸的異同兩類服務:面向連接/無連接服務 傳輸控制協議 TCPTCP 協議數據單元格式TCP 的重傳機制快重傳和快恢復快重傳舉例快恢復算法 用戶數據報協議 UDPUDP 概述UDP 基本工作過…

Electron 客戶端心跳定時任務調度庫調研文檔 - Node.js 任務調度庫技術調研文檔

Electron 客戶端心跳定時任務調度庫調研文檔 - Node.js 任務調度庫技術調研文檔 本文將對七個流行的定時任務調度庫&#xff1a;node-cron、rxjs、bull、node-schedule、agenda、bree、cron。這些庫都可以用來處理定時任務&#xff0c;但它們的特點和適用場景有所不同。我們將從…

DeepSeek 開放平臺無法充值 改用其他平臺API調用DeepSeek-chat模型方法

近幾天DeepSeek開放平臺無法充值目前已經關閉狀態&#xff0c;大家都是忙著接入DeepSeek模型 &#xff0c;很多人想使用DeepSeek怎么辦&#xff1f; 當然還有改用其他平臺API調用方法&#xff0c;本文以本站的提供chatgpt系統為例&#xff0c;如何修改DeepSeek-chat模型API接口…