當前位置:首頁 » 操作系統 » 資料庫原子性

資料庫原子性

發布時間: 2023-05-13 01:21:17

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

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

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

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

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

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

(1)資料庫原子性擴展閱讀:

資料庫事務ACID性質:

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

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

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

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

參考資料來源:

網路-資料庫事務

網路-資料庫

② 資料庫事務原子性,一致性是怎樣實現的

原子性:一個事務內的所有SQL操作是一個整體。都執行成功才算整個事務成功。如果某個失敗,則必須要會退到事務執行之前的狀態,執行成功的SQL需要被撤銷。
innodb通過undo log和redo log來實現。
事務中,每當執行一條SQL語句對數據產生了影響,就會記錄下來與之相反的操作到undo log(撤銷日誌)中,例如,更新會記錄之前的狀態,刪除會形成insert,添加會形成delete,一旦事務被回滾,則執行undo log中記錄的操作,來完成恢復到之前的狀態。這里是個 邏輯恢復哦!同時,每當執行一條事務中的SQL,會將操作記錄到redo log中,此時事務一旦被提交,就將該redolog中的操作,持久化到磁碟上,數據就持久的記錄下來了(ACID的D)。
PS:還有,undolog才是原子性的關鍵。提供redolog,應該主要目的是提升磁碟的IO開銷吧,如果直接寫入磁碟,IO開銷,會很大。如果先將操作記錄到redolog中,可以順序的記錄,批量的記錄,再一起同步到磁碟上,速度會比直接寫磁碟快些。 mysql在生成redolog時,會使用 innodb log buffer,先緩沖到內存中,再同步到redolog上,速度會更快。
另外關於,一致性,應該是個整體概念,保證所有的mysql對象(數據,索引,約束,日誌,用戶)在事務執行前後都具有完整的特性,應該是mysql所有的功能都為此服務吧!

③ 資料庫的事務機制是什麼

回答的有點多請耐心看完。
希望能幫助你還請及時採納謝謝
1事務的原理
事務就是將一組SQL語句放在同一批次內去執行,如果一個SQL語句出錯,則該批次內的所有SQL都將被取消執行。MySQL事務處理只支持InnoDB和BDB數據表類型。

1事務的ACID原則
** 1(Atomicity)原子性**: 事務是最小的執行單位,不允許分割。原子性確保動作要麼全部完成,要麼完全不起作用;
2(Consistency)一致性: 執行事務前後,數據保持一致;
3(Isolation)隔離性: 並發訪問資料庫時,一個事務不被其他事務所干擾。
4(Durability)持久性: 一個事務被提交之後。對資料庫中數據的改變是持久的,即使資料庫發生故障。

1緩沖池(Buffer Pool)
Buffer Pool中包含了磁碟中部分數據頁的映射。當從資料庫讀取數據時,會先從Buffer Pool中讀取數據,如果Buffer Pool中沒有,則從磁碟讀取後放入到Buffer Pool中。當向資料庫寫入數據時,會先寫入到Buffer Pool中,Buffer Pool中更新的數據會定期刷新到磁碟中(此過程稱為刷臟)。

2日誌緩沖區(Log Buffer)
當在MySQL中對InnoDB表進行更改時,這些更改命令首先存儲在InnoDB日誌緩沖區(Log Buffer)的內存中,然後寫入通常稱為重做日誌(redo logs)的InnoDB日誌文件中。

3雙寫機制緩存(DoubleWrite Buffer)
Doublewrite Buffer是共享表空間的物理文件的 buffer,其大小是2MB.是一個一分為二的2MB空間。
刷臟操作開始之時,先進行臟頁**『備份』**操作.將臟頁數據寫入 Doublewrite Buffer.
將Doublewrite Buffer(順序IO)寫入磁碟文件中(共享表空間) 進行刷臟操作.

4回滾日誌(Undo Log)
Undo Log記錄的是邏輯日誌.記錄的是事務過程中每條數據的變化版本和情況.
在Innodb 磁碟架構中Undo Log 默認是共享表空間的物理文件的Buffer.
在事務異常中斷,或者主動(Rollback)回滾的過程中 ,Innodb基於 Undo Log進行數據撤銷回滾,保證數據回歸至事務開始狀態.

5重做日誌(Redo Log)
Redo Log通常指的是物理日誌,記錄的是數據頁的物理修改.並不記錄行記錄情況。(也就是只記錄要做哪些修改,並不記錄修改的完成情況) 當資料庫宕機重啟的時候,會將重做日誌中的內容恢復到資料庫中。

1原子性
Innodb事務的原子性保證,包含事務的提交機制和事務的回滾機制.在Innodb引擎中事務的回滾機制是依託 回滾日誌(Undo Log) 進行回滾數據,保證數據回歸至事務開始狀態.

2那麼不同的隔離級別,隔離性是如何實現的,為什麼不同事物間能夠互不幹擾? 答案是 鎖 和 MVCC。
3持久性
基於事務的提交機制流程有可能出現三種場景.
1 數據刷臟正常.一切正常提交,Redo Log 循環記錄.數據成功落盤.持久性得以保證

2數據刷臟的過程中出現的系統意外導致頁斷裂現象 (部分刷臟成功),針對頁斷裂情況,採用Double write機制進行保證頁斷裂數據的恢復.

3數據未出現頁斷裂現象,也沒有刷臟成功,MySQL通過Redo Log 進行數據的持久化即可

4一致性
從資料庫層面,資料庫通過原子性、隔離性、持久性來保證一致性

2事務的隔離級別
Mysql 默認採用的 REPEATABLE_READ隔離級別 Oracle 默認採用的 READ_COMMITTED隔離級別

臟讀: 指一個事務讀取了另外一個事務未提交的數據。
不可重復讀: 在一個事務內讀取表中的某一行數據,多次讀取結果不同
虛讀(幻讀): 是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。

2基本語法
-- 使用set語句來改變自動提交模式
SET autocommit = 0; /*關閉*/
SET autocommit = 1; /*開啟*/

-- 注意:
--- 1.MySQL中默認是自動提交
--- 2.使用事務時應先關閉自動提交

-- 開始一個事務,標記事務的起始點
START TRANSACTION

-- 提交一個事務給資料庫
COMMIT

-- 將事務回滾,數據回到本次事務的初始狀態
ROLLBACK

-- 還原MySQL資料庫的自動提交
SET autocommit =1;

-- 保存點
SAVEPOINT 保存點名稱 -- 設置一個事務保存點
ROLLBACK TO SAVEPOINT 保存點名稱 -- 回滾到保存點
RELEASE SAVEPOINT 保存點名稱 -- 刪除保存點
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
課堂測試題目

A在線買一款價格為500元商品,網上銀行轉賬.
A的銀行卡余額為2000,然後給商家B支付500.
商家B一開始的銀行卡余額為10000

創建資料庫shop和創建表account並插入2條數據
*/

CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `shop`;

CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)

-- 轉賬實現
SET autocommit = 0; -- 關閉自動提交
START TRANSACTION; -- 開始一個事務,標記事務的起始點
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
COMMIT; -- 提交事務
# rollback;
SET autocommit = 1; -- 恢復自動提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
3事務實現方式-MVCC
1什麼是MVCC
MVCC是mysql的的多版本並發控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC。MVCC是為了實現事務的隔離性,通過版本號,避免同一數據在不同事務間的競爭,你可以把它當成基於多版本號的一種樂觀鎖。當然,這種樂觀鎖只在事務級別為RR(可重復讀)和RC(讀提交)生效。MVCC最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不沖突,極大的增加了系統的並發性能。

2MVCC的實現機制
InnoDB在每行數據都增加兩個隱藏欄位,一個記錄創建的版本號,一個記錄刪除的版本號。

在多版本並發控制中,為了保證數據操作在多線程過程中,保證事務隔離的機制,降低鎖競爭的壓力,保證較高的並發量。在每開啟一個事務時,會生成一個事務的版本號,被操作的數據會生成一條新的數據行(臨時),但是在提交前對其他事務是不可見的;對於數據的更新(包括增刪改)操作成功,會將這個版本號更新到數據的行中;事務提交成功,新的版本號也就更新到了此數據行中。這樣保證了每個事務操作的數據,都是互不影響的,也不存在鎖的問題。

3MVCC下的CRUD
SELECT:
當隔離級別是REPEATABLE READ時select操作,InnoDB每行數據來保證它符合兩個條件:
** 1 事務的版本號 大於等於 創建行版本號**
** 2 行數據的刪除版本 未定義 或者大於 事務版本號**
【行創建版本號 事務版本號 行刪除版本號】

INSERT:
InnoDB為這個新行 記錄 當前的系統版本號。

DELETE:
InnoDB將當前的系統版本號 設置為 這一行的刪除版本號。

UPDATE:
InnoDB會寫一個這行數據的新拷貝,這個拷貝的版本為 當前的系統版本號。它同時也會將這個版本號 寫到 舊行的刪除版本里。
————————————————
版權聲明:本文為CSDN博主「@Autowire」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zs18753479279/article/details/113933252

④ 資料庫事務四大特性是什麼

1、原子性(Atomicity)

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

2、 一致性(Consistency)

一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。

拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。

3、隔離性(Isolation)

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

即要達到這么一種效果:對於任意兩個並發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在並發地執行。

4、持久性(Durability)

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

(4)資料庫原子性擴展閱讀

在資料庫中,關於讀數據的概念:

1、臟讀(Dirty Reads):所謂臟讀就是對臟數據(Drity Data)的讀取,而臟數據所指的就是未提交的數據。也就是說,一個事務正在對一條記錄做修改,在這個事務完成並提交之前,這條數據是處於待定狀態的(可能提交也可能回滾)。

這時,第二個事務來讀取這條沒有提交的數據,並據此做進一步的處理,就會產生未提交的數據依賴關系。這種現象被稱為臟讀。

2、不可重復讀(Non-Repeatable Reads):一個事務先後讀取同一條記錄,但兩次讀取的數據不同,我們稱之為不可重復讀。也就是說,這個事務在兩次讀取之間該數據被其它事務所修改。

3、幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為幻讀。

熱點內容
沒有被調用的函數會參與編譯嗎 發布:2025-05-15 13:42:51 瀏覽:260
在計算機中ftp的中文 發布:2025-05-15 13:41:07 瀏覽:1000
國網校招要網簽密碼和賬號干什麼 發布:2025-05-15 13:40:25 瀏覽:179
java分 發布:2025-05-15 13:34:36 瀏覽:846
如何下載卡巴斯基安卓版 發布:2025-05-15 13:34:36 瀏覽:480
排序函數c語言 發布:2025-05-15 13:06:28 瀏覽:6
韓服lol掛機腳本 發布:2025-05-15 12:42:56 瀏覽:462
監控存儲伺服器如何調試 發布:2025-05-15 12:36:30 瀏覽:219
一萬級凈化車間有哪些配置 發布:2025-05-15 12:16:41 瀏覽:98
javazip解壓加密 發布:2025-05-15 12:15:02 瀏覽:943