當前位置:首頁 » 操作系統 » 資料庫事務級別

資料庫事務級別

發布時間: 2022-06-01 03:29:10

❶ 什麼是資料庫事務

資料庫事務,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。

一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務是資料庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。

企業級的資料庫管理系統(DBMS)都有責任提供一種保證事務的物理完整性的機制。就常用的sql Server2000系統而言,它具備鎖定設備隔離事務、記錄設備保證事務持久性等機制。因此,我們不必關心資料庫事務的物理完整性,而應該關注在什麼情況下使用資料庫事務、事務對性能的影響,如何使用事務等等。

拓展資料:

事務有三種模型:

1、隱式事務是指每一條數據操作語句都自動地成為一個事務,事務的開始是隱式的,事務的結束有明確的標記。

2、顯式事務是指有顯式的開始和結束標記的事務,每個事務都有顯式的開始和結束標記。

3、自動事務是系統自動默認的,開始和結束不用標記。

❷ Mysql資料庫中,事務是指什麼如何使用該功能

MySQL 事務

什麼是事務?

MySQL 事務主要用於處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!

在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支持事務。

  • 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。

  • 事務用來管理 insert,update,delete 語句

一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

  • 原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  • 一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。

  • 隔離性:資料庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串列化(Serializable)。

  • 持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。

在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。

from 樹懶學堂 - 一站式數據知識平台

❸ 資料庫事務隔離級別 一般用哪個

術式之後皆為邏輯,一切皆為需求和實現。希望此文能從需求、現狀和解決方式的角度幫大家理解隔離級別。


隔離級別的產生

在串型執行的條件下,數據修改的順序是固定的、可預期的結果,但是並發執行的情況下,數據的修改是不可預期的,也不固定,為了實現數據修改在並發執行的情況下得到一個固定、可預期的結果,由此產生了隔離級別。

所以隔離級別的作用是用來平衡資料庫並發訪問與數據一致性的方法。


事務的4種隔離級別

READ UNCOMMITTED 未提交讀,可以讀取未提交的數據。READ COMMITTED 已提交讀,對於鎖定讀(select with for update 或者 for share)、update 和 delete 語句, InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。 Gap locking 僅用於外鍵約束檢查和重復鍵檢查。REPEATABLE READ 可重復讀,事務中的一致性讀取讀取的是事務第一次讀取所建立的快照。SERIALIZABLE 序列化

在了解了 4 種隔離級別的需求後,在採用鎖控制隔離級別的基礎上,我們需要了解加鎖的對象(數據本身&間隙),以及了解整個數據范圍的全集組成。


數據范圍全集組成

SQL 語句根據條件判斷不需要掃描的數據范圍(不加鎖);

SQL 語句根據條件掃描到的可能需要加鎖的數據范圍;

以單個數據范圍為例,數據范圍全集包含:(數據范圍不一定是連續的值,也可能是間隔的值組成)

1. 數據已經填充了整個數據范圍:(被完全填充的數據范圍,不存在數據間隙)

  • 整形,對值具有唯一約束條件的數據范圍 1~5 ,

    已有數據1、2、3、4、5,此時數據范圍已被完全填充;

  • 整形,對值具有唯一約束條件的數據范圍 1 和 5 ,

    已有數據1、5,此時數據范圍已被完全填充;

  • 2. 數據填充了部分數據范圍:(未被完全填充的數據范圍,是存在數據間隙)

  • 整形的數據范圍 1~5 ,

    已有數據 1、2、3、4、5,但是因為沒有唯一約束,

    所以數據范圍可以繼續被 1~5 的數據重復填充;

  • 整形,具有唯一約束條件的數據范圍 1~5 ,

    已有數據 2,5,此時數據范圍未被完全填充,還可以填充 1、3、4 ;

  • 3. 數據范圍內沒有任何數據(存在間隙)

    如下:

  • 整形的數據范圍 1~5 ,數據范圍內當前沒有任何數據。

  • 在了解了數據全集的組成後,我們再來看看事務並發時,會帶來的問題。

    無控制的並發所帶來的問題

    並發事務如果不加以控制的話會帶來一些問題,主要包括以下幾種情況。

    1. 范圍內已有數據更改導致的:

  • 更新丟失:當多個事務選擇了同一行,然後基於最初選定的值更新該行時,

    由於每個事物不知道其他事務的存在,最後的更新就會覆蓋其他事務所做的更新;

  • 臟讀: 一個事務正在對一條記錄做修改,這個事務完成並提交前,這條記錄就處於不一致狀態。

    這時,另外一個事務也來讀取同一條記錄,如果不加控制,

    第二個事務讀取了這些「臟」數據,並據此做了進一步的處理,就會產生提交的數據依賴關系。

    這種現象就叫「臟讀」。

  • 2. 范圍內數據量發生了變化導致:

  • 不可重復讀:一個事務在讀取某些數據後的某個時間,再次讀取以前讀過的數據,

    卻發現其讀出的數據已經發生了改變,或者某些記錄已經被刪除了。

    這種現象就叫「不可重復讀」。

  • 幻讀:一個事務按相同的查詢條件重新讀取以前檢索過的數據,

    卻發現其他事務插入了滿足其查詢條件的新數據,這種現象稱為「幻讀」。

    可以簡單的認為滿足條件的數據量變化了。

  • 因為無控制的並發會帶來一系列的問題,這些問題會導致無法滿足我們所需要的結果。因此我們需要控制並發,以實現我們所期望的結果(隔離級別)。

    MySQL 隔離級別的實現

    InnoDB 通過加鎖的策略來支持這些隔離級別。

    行鎖包含:

  • Record Locks

    索引記錄鎖,索引記錄鎖始終鎖定索引記錄,即使表中未定義索引,

    這種情況下,InnoDB 創建一個隱藏的聚簇索引,並使用該索引進行記錄鎖定。

  • Gap Locks

    間隙鎖是索引記錄之間的間隙上的鎖,或者對第一條記錄之前或者最後一條記錄之後的鎖。

    間隙鎖是性能和並發之間權衡的一部分。

    對於無間隙的數據范圍不需要間隙鎖,因為沒有間隙。

  • Next-Key Locks

    索引記錄上的記錄鎖和索引記錄之前的 gap lock 的組合。

    假設索引包含 10、11、13 和 20。

    可能的next-key locks包括以下間隔,其中圓括弧表示不包含間隔端點,方括弧表示包含端點:

  • (負無窮大, 10] (10, 11] (11, 13] (13, 20] (20, 正無窮大) 對於最後一個間隔,next-key將會鎖定索引中最大值的上方,


  • 左右滑動進行查看

    "上確界"偽記錄的值高於索引中任何實際值。

    上確界不是一個真正的索引記錄,因此,實際上,這個 next-key 只鎖定最大索引值之後的間隙。

    基於此,當獲取的數據范圍中,數據已填充了所有的數據范圍,那麼此時是不存在間隙的,也就不需要 gap lock。

    對於數據范圍內存在間隙的,需要根據隔離級別確認是否對間隙加鎖。

    默認的 REPEATABLE READ 隔離級別,為了保證可重復讀,除了對數據本身加鎖以外,還需要對數據間隙加鎖。

    READ COMMITTED 已提交讀,不匹配行的記錄鎖在 MySQL 評估了 where 條件後釋放。

    對於 update 語句,InnoDB 執行 "semi-consistent" 讀取,這樣它會將最新提交的版本返回到 MySQL,

    以便 MySQL 可以確定該行是否與 update 的 where 條件相匹配。

    總結&延展:

    唯一索引存在唯一約束,所以變更後的數據若違反了唯一約束的原則,則會失敗。

    當 where 條件使用二級索引篩選數據時,會對二級索引命中的條目和對應的聚簇索引都加鎖;所以其他事務變更命中加鎖的聚簇索引時,都會等待鎖。

    行鎖的增加是一行一行增加的,所以可能導致並發情況下死鎖的發生。

    例如,

    在 session A 對符合條件的某聚簇索引加鎖時,可能 session B 已持有該聚簇索引的 Record Locks,而 session B 正在等待 session A 已持有的某聚簇索引的 Record Locks。

    session A 和 session B 是通過兩個不相乾的二級索引定位到的聚簇索引。

    session A 通過索引 idA,session B通過索引 idB 。

    當 where 條件獲取的數據無間隙時,無論隔離級別為 rc 或 rr,都不會存在間隙鎖。

    比如通過唯一索引獲取到了已完全填充的數據范圍,此時不需要間隙鎖。

    間隙鎖的目的在於阻止數據插入間隙,所以無論是通過 insert 或 update 變更導致的間隙內數據的存在,都會被阻止。

    rc 隔離級別模式下,查詢和索引掃描將禁用 gap locking,此時 gap locking 僅用於外鍵約束檢查和重復鍵檢查(主要是唯一性檢查)。

    rr 模式下,為了防止幻讀,會加上 Gap Locks。

    事務中,SQL 開始則加鎖,事務結束才釋放鎖。

    就鎖類型而言,應該有優化鎖,鎖升級等,例如rr模式未使用索引查詢的情況下,是否可以直接升級為表鎖。

    就鎖的應用場景而言,在回放場景中,如果確定事務可並發,則可以考慮不加鎖,加快回放速度。

    鎖只是並發控制的一種粒度,只是一個很小的部分:

    從不同場景下是否需要控制並發,(已知無交集且有序的數據的變更,MySQL 的 MTS 相同前置事務的多事務並發回放)

    並發控制的粒度,(鎖是一種邏輯粒度,可能還存在物理層和其他邏輯粒度或方式)

    相同粒度下的優化,(鎖本身存在優化,如IX、IS類型的優化鎖)

    粒度載入的安全&性能(如獲取行鎖前,先獲取頁鎖,頁鎖在執行獲取行鎖操作後即釋放,無論是否獲取成功)等多個層次去思考並發這玩意。

❹ mysql資料庫的事務隔離級別有哪些

事務隔離級別的方法:
1.全局修改,修改mysql.ini配置文件,在最後加上
1 #可選參數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
2 [mysqld]
3 transaction-isolation = REPEATABLE-READ

這里全局默認是REPEATABLE-READ,其實MySQL本來默認也是這個級別
2.對當前session修改,在登錄mysql客戶端後,執行命令:
set session transaction isolation level read uncommitted;

要記住mysql有一個autocommit參數,默認是on,他的作用是每一條單獨的查詢都是一個事務,並且自動開始,自動提交(執行完以後就自動結束了,如果你要適用select for update,而不手動調用 start transaction,這個for update的行鎖機制等於沒用,因為行鎖在自動提交後就釋放了),所以事務隔離級別和鎖機制即使你不顯式調用start transaction,這種機制在單獨的一條查詢語句中也是適用的,分析鎖的運作的時候一定要注意這一點

❺ 介紹一下資料庫事務

資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。
原子性(Atomic)(Atomicity) 事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
一致性(Consistent)(Consistency) 事務在完成時,必須使所有的數據都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制所有已知的完整性約束。如,當開發用於轉賬的應用程序時,應避免在轉賬過程中任意移動小數點。
隔離性(Insulation)(Isolation) 由並發事務所作的修改必須與任何其它並發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一並發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱為隔離性,因為它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續運行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程序降低隔離級別以換取更大的吞吐量。
持久性(Duration)(Durability) 事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。

❻ 資料庫事務級別

ACID,指資料庫事務正確執行的四個基本要素的縮寫.包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的資料庫系統,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性,交易過程極可能達不到交易方的要求.
原子性
整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性
在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
隔離性
兩個事務的執行是互不幹擾的,一個事務不可能看到其他事務運行時,中間某一時刻的數據。
持久性
在事務完成以後,該事務所對資料庫所作的更改便持久的保存在資料庫之中,並不會被回滾。

❼ MySQL的默認事務隔離級別是

mysql的4種事務隔離級別,如下所示:

1、未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會話中未提交事務修改的數據。

2、提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數資料庫默認都是該級別 (不重復讀)。

3、可重復讀(Repeated Read):可重復讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標准中,該隔離級別消除了不可重復讀,但是還存在幻象讀,但是innoDB解決了幻讀。

4、串列讀(Serializable):完全串列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。

相關簡介

MySQL是一個關系型資料庫管理系統,由瑞典MySQL AB公司開發,屬於Oracle旗下產品。MySQL 是最流行的關系型資料庫管理系統之一,在WEB應用方面,MySQL是最好的RDBMS(Relational Database Management System,關系資料庫管理系統) 應用軟體之一。

MySQL是一種關系型資料庫管理系統,關系資料庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標准化語言。MySQL 軟體採用了雙授權政策,分為社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。

❽ 資料庫操作的時候,什麼情況下需要用到事務

當資料庫需要處理操作量大、復雜度高的數據的時候需要用到事務。用事務是為了保證資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。

一個資料庫事務通常包含了一個序列的對資料庫的讀/寫操作。它的存在包含有以下兩個目的:

1、為資料庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。

2、當多個應用程序在並發訪問資料庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。

當事務被提交給了資料庫管理系統,則資料庫管理系統需要確保該事務中的所有操作都成功完成且其結果被永久保存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態;同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的運行。

(8)資料庫事務級別擴展閱讀:

資料庫事務ACID性質:

1、原子性(Atomicity):事務作為一個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行。

2、一致性(Consistency):事務應確保資料庫的狀態從一個一致狀態轉變為另一個一致狀態,一致狀態的含義是資料庫中的數據應滿足完整性約束。

3、隔離性(Isolation):多個事務並發執行時,一個事務的執行不應影響其他事務的執行。

4、持久性(Durability):已被提交的事務對資料庫的修改應該永久保存在資料庫中。

參考資料來源:

網路-資料庫事務

網路-資料庫

❾ 資料庫事務的ACID隔離級中P0和P4的區別

spring的事務處理主要是依靠AOP實現的,這個沒什麼好說的隨便搜索一下,網上很多示例。

隔離級別是針對並發事務而言的,單個事務的處理很簡單不多說。並發事務的處理則比較復雜,因為往往一條數據是跨事務的,這會造成許多不可預知的後果。

一般來說,系統執行並發事務時,會把當前在執行的事務獨立起來,也就是和其他事務進行隔離。好像系統中只有這一個事務,其他事務不存在一樣。這也就是完全隔離,即系統中只運行單位時間內,最多隻有一個事務在執行,其他事務要等到該事務執行完畢之後才能執行,這在現實中基本是不可行的,比如,你要更新你的QQ用戶信息,那麼就是說,在你更新的這段時間內,其他的用戶是無法更新他的用戶信息的。

舉個深動的例子,把事務比作一條在公路上奔跑的汽車,完全隔離,就像是,在汽車從公路一頭到另一頭這段時間內,公路上不允許有其他的汽車,這樣做當然可以完全避免車禍,也就是數據跨事務帶來的隱患風險,但是帶來了巨大的效率問題,那麼如果同時在公路上讓多輛汽車行駛會造成什麼情況呢。

具體來說有一下幾種:

更新丟失(Lost Update):兩個事務都企圖去更新一行數據,導致事務拋出異常退出,兩個事務的更新都白費了。

臟數據(Dirty Read):如果第二個應用程序使用了第一個應用程序修改過的數據,而這個數據處於未提交狀態,這時就會發生臟讀。第一個應用程序隨後可能會請求回滾被修改的數據,從而導致第二個事務使用的數據被損壞,即所謂的「變臟」。

不可重讀(Unrepeatable Read):一個事務兩次讀同一行數據,可是這兩次讀到的數據不一樣,就叫不可重讀。如果一個事務在提交數據之前,另一個事務可以修改和刪除這些數據,就會發生不可重讀。

幻讀(Phantom Read):一個事務執行了兩次查詢,發現第二次查詢結果比第一次查詢多出了一行,這可能是因為另一個事務在這兩次查詢之間插入了新行。

以上就是並行事務處理時常遇到的大致問題。針對這些問題,提出了幾個不同的事務隔離級別,適應特定的環境需要。

具體是:

讀操作未提交(Read Uncommitted):說明一個事務在提交前,其變化對於其他事務來說是可見的。這樣臟讀、不可重讀和幻讀都是允許的。當一個事務已經寫入一行數據但未提交,其他事務都不能再寫入此行數據;但是,任何事務都可以讀任何數據。這個隔離級別使用排寫鎖實現。

讀操作已提交(Read Committed):讀取未提交的數據是不允許的,它使用臨時的共讀鎖和排寫鎖實現。這種隔離級別不允許臟讀,但不可重讀和幻讀是允許的。

可重讀(Repeatable Read):說明事務保證能夠再次讀取相同的數據而不會失敗。此隔離級別不允許臟讀和不可重讀,但幻讀會出現。

可串列化(Serializable):提供最嚴格的事務隔離。這個隔離級別不允許事務並行執行,只允許串列執行。這樣,臟讀、不可重讀或幻讀都可發生

熱點內容
2019速騰買什麼配置好 發布:2025-01-11 01:35:07 瀏覽:828
博越存儲異常 發布:2025-01-11 01:24:31 瀏覽:916
我的世界還原中國伺服器版圖 發布:2025-01-11 01:18:45 瀏覽:382
pythonopenasfile 發布:2025-01-11 01:17:06 瀏覽:971
hbasejavaapi 發布:2025-01-11 01:11:09 瀏覽:744
我的世界pe版飢餓伺服器 發布:2025-01-11 01:09:39 瀏覽:485
異構資料庫數據同步 發布:2025-01-11 01:09:04 瀏覽:957
c語言三角波 發布:2025-01-11 01:02:11 瀏覽:78
php正則轉義 發布:2025-01-11 01:00:03 瀏覽:691
手拉的箱包上的密碼鎖一般是多少 發布:2025-01-11 00:59:55 瀏覽:8