MySQL 與 Oracle 事務:深度解析與全面對比

在數據庫管理領域,事務是確保數據一致性和完整性的核心機制,它允許用戶將一系列操作視為一個不可分割的整體,要么全部成功執行,要么全部回滾。MySQL 和 Oracle 作為兩款廣泛使用的關系型數據庫管理系統,它們在事務處理方面既有共性,也存在諸多差異。接下來,我們將深入探討 MySQL 和 Oracle 事務的詳細內容,并對比兩者的區別。

MySQL事務詳解

事務的概念和特性

事務 是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。
? ? ? ? :默認MySQL的事務是自動提交的,也就是說,當執行一條DML語句,MySQL會立即隱式的提交事務。

? ? ? ? Oracle需要顯示提交事務,plsql軟件可通過設置自動提交

存儲引擎

? ? ? ? 存儲引擎就是存儲數據、建立索引、更新/查詢數據等技術的實現方式。存儲引擎是基于表的,而不是基于庫的,所以存儲引擎也可稱為表類型。

innoDB引擎

????????innoDB引擎是一種兼顧可靠性和高性能的通用存儲引擎。

特點:DML操作遵循ACID模型,支持事務行級鎖,提高并發訪問功能,支持外鍵foreign key約束,保證數據的完整性和正確性。

事務四大特性

  • 原子性(Atomicity):事務中的操作是一個不可分割的最小單元,要么全部執行,要么全部不執行。例如,在銀行轉賬操作中,從賬戶 A 扣除金額和向賬戶 B 增加金額這兩個操作必須同時成功或失敗,不能出現 A 賬戶扣錢但 B 賬戶未到賬的情況。?
  • 一致性(Consistency):事務執行前后,數據庫始終處于合法的狀態。假設數據庫中定義了某張表的字段必須滿足特定約束,如主鍵唯一、外鍵關聯正確等,事務執行后,這些約束依然要得到保證。?
  • 隔離性(Isolation):多個事務并發執行時,一個事務的執行不能被其他事務干擾,每個事務都感覺像是在獨立使用數據庫。?
  • 持久性(Durability):一旦事務提交,其對數據庫所做的修改就會永久保存,即使系統發生故障(如停電、宕機等)也不會丟失。

事務并發時存在的問題

臟讀(Dirty Read)

? ? ? ? 臟數據所指的就是未提交的數據,而臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。

? ? ? ? :一個事務正對一條記錄做修改,在這個事務完成并提交之前,這條數據是處于待定狀態(可能提交也可能回滾),此時,第二個事務來讀取這條沒有提交的數據,并據此做進一步的處理,就會產生未提交的數據依賴關系。這種現象被稱為臟讀。

不可重復讀(Non-repeatable Read)

? ? ? ? 一個事務先后讀取同一條記錄,而事務在兩次讀取之間該數據被其他事務所修改,則兩次讀取的數據不同,我們稱為不可重復讀。

? ? ? ? :事務1在讀取某一數據,而事務2立馬修改了這個數據并提交事務給數據庫,事務1再次讀取該數據就得到了不同的結果,發生了不可重復讀。

? ? ? ? 不可重復讀和臟讀的區別:臟讀是某一個事務讀取了另一個事務未提交的事務,而不可重復讀則是在同一事務內讀取了前一事務提交的數據,即前一次讀到的數據是另一個事務提交前,后一次讀到的數據是提交后的。

幻讀(Phantom Read)

? ? ? ? 一個事物按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足查詢跳到的新數據,這種現象稱為幻讀,幻讀是指當事務不是獨立執行時發生的一種現象。

? ? ? ? 幻讀和不可重復讀的區別:幻讀和不可重復讀都是讀取了另一條已經提交的事務(這點和臟讀不同),所不同的是不可重復讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體。

四個隔離級別?

MySQL 支持四種事務隔離級別,不同的隔離級別會影響事務之間的并發行為和數據一致性:

  1. 讀未提交(Read Uncommitted):這是最低的隔離級別,雖然擁有超高的并發處理能力和很低的系統開銷,但很少用于實際應用。一個事務可以讀取另一個未提交事務的數據。這種隔離級別可能會出現臟讀、不可重復讀和幻讀問題 。?
  2. 讀已提交(Read Committed):一個事務只能讀取已提交事務的數據。它避免了臟讀,但仍可能出現不可重復讀和幻讀問題。Oracle 數據庫默認的隔離級別就是讀已提交。?
  3. 可重復讀(Repeatable Read):在一個事務內,多次讀取同一數據時,結果始終保持一致,即使其他事務對該數據進行了修改并提交。MySQL 默認的隔離級別是可重復讀,它通過多版本并發控制(MVCC)機制避免了臟讀和不可重復讀,但在某些情況下,幻讀問題依然可能存在 。?
  4. 可串行化(Serializable):這是最高的隔離級別,它通過強制事務串行執行,避免了所有的并發問題,包括臟讀、不可重復讀和幻讀。但由于事務只能一個接一個地執行,會極大地降低數據庫的并發性能。
隔離級別臟讀不可重復讀幻讀
讀未提交
讀已提交×
可重復讀××
可串行化××

Oracle 事務詳解

事務的概念與特性

Oracle 中的事務同樣遵循 ACID 特性,其核心概念與 MySQL 類似,將一組操作作為一個整體,保證數據的一致性和完整性。例如,在企業的訂單處理系統中,創建訂單、扣除庫存、更新客戶余額等操作會被封裝在一個事務內,確保整個業務流程的正確執行。

:Oracle的事務特性和事務并發時存在的問題與MySQL相同。

存儲引擎

????????Oracle 的 “單一存儲引擎” 設計確保了數據在事務處理、數據分析、高可用性等場景下的一致性和兼容性。用戶可通過調整存儲參數(如塊大小、壓縮方式、分區策略)和選擇合適的數據組織方式(如表類型、索引結構),靈活應對不同的業務需求。這與 MySQL 等支持多存儲引擎(如 InnoDB、MyISAM)的數據庫形成鮮明對比,體現了 Oracle 在企業級數據管理中的一體化設計理念。

事務的隔離級別

Oracle支持兩種主要的事務隔離級別:

  1. 讀已提交(Read Committed):這是 Oracle 的默認隔離級別,它保證事務只能讀取其他事務已經提交的數據,避免了臟讀。在該隔離級別下,對于相同的查詢,每次執行可能會得到不同的結果(因為其他事務可能提交了新的數據修改),存在不可重復讀和幻讀問題。?
  2. 可串行化(Serializable):與 MySQL 的可串行化隔離級別類似,它通過對數據加鎖,使事務按照順序依次執行,從而避免了所有的并發問題。但這種方式會嚴重影響數據庫的并發性能,因此在實際應用中,除非對數據一致性要求極高且并發量較低的場景,一般較少使用 。此外,Oracle 還提供了一種基于多版本的讀一致性機制(Read Consistency),它允許事務在查詢數據時獲取到一個一致性的快照,即使在查詢過程中有其他事務修改了數據,也不會影響當前事務的查詢結果,在一定程度上緩解了并發讀取時的數據不一致問題 。
隔離級別臟讀不可重復讀幻讀
讀已提交(默認)
可串行化

事務操作

查看MySQL支持哪些引擎。

show engines;   -- 當前MySQL版本支持哪些引擎

:innoDB支持事務,myisam、memory等不支持事務

查看MySQL當前默認的存儲引擎。

show variables like '%storage_engine%';

:MySQL 5.5版本前,默認存儲引擎是MyISAM
? ? ? ? ?MySQL 5.5版本后,默認存儲引擎是innoDB

顯示自動提交事務的狀態(insert、update、delete)

show variables like 'autoconmit';

開啟事務

-- MySQL
set @@autocommit=0 ;    -- 將自動提交事務關閉,只對當前對話有效
set @@autocommit=1 ;    -- 設置自動提交事務begin;    -- 開啟事務
start transaction;    -- 開啟事務-- Oracle
-- 執行DML語句,隱式開啟事務
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;

提交事務

-- MySQL
select @@autoconmit;    -- 查詢結果為1自動提交
set @@autocommit=0 ;    -- 為0手動提交commit;    -- 提交事務(成功)
rollback;  -- 回滾事務(失敗)-- Oracle
-- 查詢自動提交事務
SHOW AUTOCOMMIT;  
-- 輸出:AUTOCOMMIT OFF(關閉自動提交) 或 AUTOCOMMIT ON(開啟自動提交)-- 設置自動提交格式
SET AUTOCOMMIT ON;   -- 開啟自動提交(每條SQL執行后自動COMMIT)
SET AUTOCOMMIT OFF;  -- 關閉自動提交(默認行為)
-- 事務的提交與回滾
UPDATE employees SET salary = salary*1.1 WHERE department_id = 10;
-- 執行多個DML語句...COMMIT;  -- 提交所有更改
ROLLBACK;  -- 回滾所有更改

MySQL和Oracle事務區別總結

隔離級別支持?

MySQL 支持四種完整的事務隔離級別,而 Oracle 主要支持讀已提交和可串行化兩種隔離級別。雖然 Oracle 也有讀一致性機制,但與 MySQL 的隔離級別概念有所不同。MySQL 的可重復讀隔離級別通過 MVCC 在一定程度上解決了幻讀問題,而 Oracle 的讀已提交隔離級別下幻讀問題依然較為突出,需要通過其他機制(如顯式加鎖)來處理 。

事務控制語句?

雖然兩者都有開啟事務、提交事務和回滾事務的語句,但在具體使用和功能上存在細微差別。例如,MySQL 的 START TRANSACTION 和 BEGIN 功能基本相同,都用于顯式開啟事務;而 Oracle 的 BEGIN 通常用于開啟一個匿名塊,隱式開啟事務 。在保存點的使用上,Oracle 提供了更豐富的語句來管理保存點,如 ROLLBACK TO SAVEPOINT AND RELEASE SAVEPOINT ,相比之下,MySQL 在保存點管理方面的功能相對簡單 。

性能表現?

在事務處理性能方面,由于 MySQL 的隔離級別和鎖機制更加靈活,在一些高并發且對數據一致性要求不是極高的場景下,MySQL 可能具有更好的并發性能。而 Oracle 的事務處理機制更側重于數據的一致性和完整性,在復雜的企業級應用中,尤其是對數據準確性要求嚴格的場景下,Oracle 能夠提供更可靠的事務保障,但在高并發場景下,其性能可能會受到一定影響 。?

綜上所述,MySQL 和 Oracle 在事務處理方面各有特點。在實際應用中,需要根據具體的業務需求、數據一致性要求和并發量等因素,選擇合適的數據庫及事務處理策略。

求點贊、求關注、求收藏!!!會繼續發布關于數據開發方面的博客!

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

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

相關文章

麒麟系統如何輸出啟動日志到串口

1、臺式機系統啟動日志輸出到串口 (1)GRUB配置 編輯GRUB配置文件(如/etc/default/grub),添加或修改以下參數: GRUB_CMDLINE_LINUX“consoletty0 consolettyS0,115200n8” tty0:表示將日志輸出…

JUC:2棧和棧幀的定義

這部分內容雖然是JVM中的定義,但是在juc中屬于底層知識,必須要學習 每個線程在創建時,就會將自身的資源存儲在棧中,將線程需要運行的方法存放在方法區。 棧中會存儲方法的局部變量、方法的參數以及方法返回的地址,這…

阿里云OSS上傳文件Utils (@PostConstruct注解配置+Environment )

首先在 application.yaml 配置bucketName, endpoint, accessKeyId, accessKeySecret這里利用的是 spring 的生命周期, 在 bean 實例化后,使用PostConstruct注解 Environment 屬性 進行spring上下文環境賦值 package com.shuai.utils;import com.aliyun.oss.*; import com.aliy…

Jetson家族橫向對比:如何選擇你的邊緣計算設備

Jetson家族橫向對比:如何選擇你的邊緣計算設備 一、邊緣計算設備選型核心維度 在選擇Jetson平臺前,需明確以下關鍵指標: 算力需求:TOPS(INT8) / FP16精度功耗限制:被動散熱/主動散熱接口擴展:CSI攝像頭數…

《聊一聊ZXDoc》之汽車服務導向SOME/IP

ZXDoc支持SOME/IP功能,通過服務導向架構實現跨域通信標準化,降低系統耦合,支持動態服務發現與調用,提升分布式系統擴展性和維護效率。 什么是SOME/IP? SOME/IP(Scalable service-Oriented MiddlewarE ov…

Learning Semantic-Aware Knowledge Guidance for Low-Light Image Enhancement 論文閱讀

學習語義感知知識引導用于低光照圖像增強 摘要 低光圖像增強(LLIE)研究如何改善照明并生成正常光照的圖像。大多數現有方法通過全局和均勻的方式改進低光圖像,而沒有考慮不同區域的語義信息。如果沒有語義先驗,網絡可能會容易偏…

【(Topk問題及其二叉樹遍歷】

Topk問題及其二叉樹遍歷 1.Topk問題2.二叉樹的前序,中序,后序3.求二叉樹的個數(TreeSize)。4.求二叉樹的最大深度(maxDepth)。5.求二叉樹的第K層的節點個數(TreeKLevel)。6.查找二叉…

AI+實時計算如何賦能金融系統?DolphinDB 在國泰君安期貨年度中期策略會的演講

6月25日,國泰君安期貨2025年度中期策略會在上海順利開幕。本次策略會以“觀勢明變,本固枝榮”為主題,特邀15位重量級行業嘉賓和52位明星分析師發表精彩觀點,DolphinDB 受邀出席會議并作主題演講。 實時計算如何賦能量化投研交易 …

PHP Protobuf 手寫生成器,

? 以下是一個純 PHP 編寫的通用 Protobuf 二進制生成器,支持: varint fixed32 fixed64 length-delimited(如字符串、嵌套 message) 嵌套結構 (nested) 多字段 repeated ? 封裝器代碼(可直接用) &…

喜訊 | Mediatom斬獲2025第十三屆TopDigital創新營銷獎「年度程序化廣告平臺」殊榮

6月27日,2025第十三屆TopDigital創新營銷盛典在上海圓滿落幕,TopDigital創新營銷獎獲獎結果也已正式揭曉。本屆TopDigital創新營銷獎共有694家參展企業,3326件案例,AdMergeX旗下Mediatom媒體變現SaaS及服務平臺在眾多作品中脫穎而…

SQL 中 EXISTS 的原理與作用詳解

平常也一直在用EXISTS 來進行邏輯判斷,但是從來沒有正經理解它,只知道找到有就返回True,沒有就返回False。那么今天詳細的理解一下(主要借鑒了CSDN 其他博客文章,以及自己做的一個小例子) 一、EXISTS是什么…

【Docker】解決:構建(docker build)或重新運行容器時,丟失apt-get update問題

一、解決:構建(docker build)或重新運行容器時,丟失apt-get update問題 在 Docker 容器中,每次構建(docker build)或重新運行容器時,默認情況下所有更改都會丟失,因為容…

流程管理系統方案成本評估報告(第一稿,復盤明確數據不準確,僅供參考哦)

??一、成本評估框架?? 所在制造業流程數字化轉型的成本需從??一次性投入??與??持續運營成本??兩個維度分析,并量化??直接收益??與??間接收益??。詳細評估模型初稿: ??二、成本構成與數據支撐?? ??1. 一次性投入成本?? ??項目????費用范圍…

高并發分布式鎖解決方案對比與選型指南

高并發分布式鎖解決方案對比與選型指南 在大規模分布式系統中,分布式鎖是確保資源互斥訪問、保證數據一致性的關鍵組件。針對不同業務場景,分布式鎖的實現方案多種多樣,各有優缺點。本文將從問題背景出發,對Redis原生鎖/RedLock、…

全面掌握Vue 3響應式:ref自動解包、reactive對象替換及響應式丟失問題

Vue 3的響應式系統是其最核心的特性之一,主要通過ref和reactive這兩個API來實現。本文將詳細介紹這兩個API的使用方法、區別以及最佳實踐。 1. ref()的基本使用 ref()用于創建一個響應式的數據引用。它可以包裝任何類型的值,包括基本類型和對象類型。 …

【科普】 AI大模型應用架構圖大全

AI大模型應用架構圖大全 AI大模型技術全景視圖: AI大模型通用技術架構圖 AI大模型通用技術架構圖 AI大模型通用技術架構圖 RAG知識庫業務架構圖 AI農業大模型技術架構圖 AI導購大模型技術架構圖 AI導購大模型技術架構圖 AI大模型合規風控管理架構圖 AI大模型合規管…

Educational Codeforces Round 180 (Rated for Div. 2) A-D題解

A. Race 題意 在一個數軸上,獎品可能出現在 x x x 點或 y y y 點,Alice 現在在 a a a 點,請問Bob是否存在一個點 b b b,使得無論獎品出現在 x x x 點還是 y y y 點,Bob都能比Alice先拿到( ∣ b ?…

IPv6配置

IPv6的基本配置 構建如下圖所示的實訓拓撲,按如下要求完成實訓內容: (1)啟用路由器的IPv6功能; (2)配置路由器接口的IPv6地址; (3)測試兩臺路由器的連通性…

flutter項目環境升級二:從Flutter2.10.5升級到3.29.3

系統:windows Android Studio:Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1 Flutter SDK: Flutter3.29.3 JDK: java 17 詳細的AGP / Gradle / Kotlin / JDK版本兼容關系可以百度或者到官方文檔查詢,其他博主給的很詳細。確認好想要的版本兼容 這位大哥有對照表…

【網站內容安全檢測】之1:獲取網站所有鏈接sitemap數據

不多BB,直接上代碼: main.go package mainimport ("bufio""crypto/tls""fmt""io""net/http""net/url""os""strings""sync""time"_ "net/ht…