datagrid只传入了一部分的数据 未显示全_软件开发面试之数据库事务篇
軟件開發(fā)面試之數(shù)據(jù)庫事務篇
不少的小伙伴正在準備或是即將準備后端開發(fā)的崗位,對于這個崗位而言數(shù)據(jù)庫是必問的一個知識點,而數(shù)據(jù)庫的事務和數(shù)據(jù)庫的隔離級別又是問到數(shù)據(jù)庫時必問的重點。小編從年初開始也是不斷的再學習找工作的知識,在面過軟件開發(fā)崗的幾次面試中,數(shù)據(jù)庫是每次基礎面的必問知識,接下來的這篇文章我來給大家細說一下數(shù)據(jù)庫事務的那些事。
文章目錄:1. 數(shù)據(jù)庫事務是什么?????1.1 事務的定義????1.2 事務的特點????????1.2.1 原子性????????1.2.2 一致性????????1.2.3 隔離性????????1.2.4 持久性????1.3 事務的狀態(tài)2. 數(shù)據(jù)庫隔離級別????2.1 Read Uncommitted????????2.1.1 臟讀????2.2 Read Commit????????2.2.1 不可重復讀????2.3 Repeatable Read????????2.3.1 幻讀????2.4 Serializable3. 總結
1. 數(shù)據(jù)庫事務是什么?
所謂事務,就是要完成一件事情,在這個事情中包含了多個任務。
當所有的任務都執(zhí)行成功,這個事情就是成功的:所有改動的數(shù)據(jù)生效。
當任意一個任務執(zhí)行失敗,這個事情就是失敗的:所有改動的數(shù)據(jù)回退。
1.1 事務的定義
事務是數(shù)據(jù)庫中一個單獨的執(zhí)行單元。當在數(shù)據(jù)庫中更改數(shù)據(jù)成功時,在事務中更改的數(shù)據(jù)便會提交,不再更改,否則事物取消或回滾。數(shù)據(jù)庫事務是為了保證在數(shù)據(jù)庫更改失敗的情況下還可以回到執(zhí)行事務之前的狀態(tài)。
SQL標準規(guī)定當一個SQL語句被執(zhí)行,就隱含地開始了一個事務,事務最后被提交或回滾之后事務就結束,如果一個事務沒有完成commit,其影響都可以被回滾,在斷點和系統(tǒng)崩潰的情況下,回滾會在事務重啟后執(zhí)行。
每一個SQL語句默認為自成事務,且一旦執(zhí)行完就提交。如果一個事務需要執(zhí)行多條SQL語句,就必須關閉默認的每一個SQL語句自動提交。如果關閉自動提交也依賴于具體的SQL實現(xiàn)。也可以使用BEGIN或START TRANSACTION,顯示地開啟一個事務;
1.2 事務的特點
對于數(shù)據(jù)庫事務,必須滿足以下四種性質,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。即ACID四種屬性。
1.2.1 原子性
原子性要求事務必須被原子性執(zhí)行,即要么不執(zhí)行(執(zhí)行過程中出現(xiàn)錯誤,回滾事務),要么全執(zhí)行(執(zhí)行成果,提交事務)。避免執(zhí)行一部分操作帶來的錯誤。這個工作由事務管理部件處理。
1.2.2 一致性
一致性表示一個事務執(zhí)行前后,數(shù)據(jù)庫必須保證一致性的狀態(tài)。數(shù)據(jù)庫的一致性狀態(tài)應該滿足模式鎖指定的約束,那么在完整執(zhí)行該事物后數(shù)據(jù)庫仍然處于一致性狀態(tài)。
一致性是指在事務開始之前和事務結束以后,數(shù)據(jù)庫的完整性約束沒有被破壞。這是說數(shù)據(jù)庫事務不能破壞關系數(shù)據(jù)的完整性以及業(yè)務邏輯上的一致性。
案例:對銀行轉帳事務,不管事務成功還是失敗,應該保證事務結束后ACCOUNT表中aaa和bbb的存款總額為2000元,即事務執(zhí)行前后數(shù)據(jù)庫的狀態(tài)是一致的。
1.2.3 隔離性
當兩個或多個事務并發(fā)執(zhí)行時,為了保證數(shù)據(jù)之間的安全性,將一個事物內部的操作隔離起來,不被其他正在執(zhí)行的事物看到。確保隔離性是并發(fā)控制部件的責任。
多個事務并發(fā)訪問時,事務之間是隔離的,一個事務不應該影響其它事務運行效果。
這指的是在并發(fā)環(huán)境中,當不同的事務同時操縱相同的數(shù)據(jù)時,每個事務都有各自的完整數(shù)據(jù)空間。由并發(fā)事務所做的修改必須與任何其他并發(fā)事務所做的修改隔離。事務查看數(shù)據(jù)更新時,數(shù)據(jù)所處的狀態(tài)要么是另一事務修改它之前的狀態(tài),要么是另一事務修改它之后的狀態(tài),事務不會查看到中間狀態(tài)的數(shù)據(jù)。
當多個事務并發(fā)時,SQL Server利用加鎖和阻塞來保證事務之間不同等級的隔離性。一般情況下,完全的隔離性是不現(xiàn)實的,完全的隔離性要求數(shù)據(jù)庫同一時間只執(zhí)行一條事務,這樣會嚴重影響性能。想要理解SQL Server中對于隔離性的保障,首先要了解并發(fā)事務之間是如何干擾的。
1.2.4 持久性
也稱永久性,事務完成以后,DBMS保證它對數(shù)據(jù)庫中的數(shù)據(jù)的修改是永久性的,提交后不會被回滾。當系統(tǒng)或介質發(fā)生變化時,該修改也永久保持。確保持久性是數(shù)據(jù)庫系統(tǒng)中恢復管理部件的責任。
事務的 ACID 特性概念簡單,但不是很好理解,主要是因為這幾個特性不是一種平級關系:
只有滿足一致性,事務的執(zhí)行結果才是正確的。
在無并發(fā)的情況下,事務串行執(zhí)行,隔離性一定能夠滿足。此時只要能滿足原子性,就一定能滿足一致性。
在并發(fā)的情況下,多個事務并行執(zhí)行,事務不僅要滿足原子性,還需要滿足隔離性,才能滿足一致性。
事務滿足持久化是為了能應對系統(tǒng)崩潰的情況。
1.3 事務的狀態(tài)
事務必須屬于以下五個狀態(tài)之一。
① 活動狀態(tài):初始狀態(tài);事務執(zhí)行時處于這個狀態(tài);
② 部分提交狀態(tài):最后一條語句執(zhí)行之后;
③ 失敗狀態(tài):發(fā)現(xiàn)正常的執(zhí)行不能繼續(xù)之后;
④ 中止狀態(tài):事務回滾并且已經恢復到事務開始執(zhí)行之前的狀態(tài);
⑤ 提交狀態(tài):成功完成后。
事務進入中止狀態(tài)之后可以選擇重啟事務或殺死事務。重啟事務是僅當引起事務中止的是硬件錯誤或不是由事務的內部邏輯產生的軟件錯誤時,重啟事務看成是一個新的事物;殺死事務是由于事務的內部邏輯錯誤,只有重寫應用程序才能改正,或者由于輸入錯誤,或所需數(shù)據(jù)在數(shù)據(jù)庫中沒有找到。
注意:
BEGIN或START TRANSACTION:顯示地開啟一個事務;
COMMIT:也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,并使已對數(shù)據(jù)庫進行的所有修改稱為永久性的;
ROLLBACK:有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束用戶的事務,并撤銷正在進行的所有未提交的修改;
SAVEPOINT identifier:SAVEPOINT允許在事務中創(chuàng)建一個保存點,一個事務中可以有多個SAVEPOINT;
RELEASE SAVEPOINT identifier:刪除一個事務的保存點,當沒有指定的保存點時,執(zhí)行該語句會拋出一個異常;
ROLLBACK TO identifier:把事務回滾到標記點;
SET TRANSACTION:用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
2. 數(shù)據(jù)庫隔離級別
數(shù)據(jù)庫有四種類型的事務隔離級別:不提交的讀、提交的讀、可重復的讀、串行化。
| 未提交讀:Read uncommitted | 最低級別 | 存在 | 存在 | 存在 |
| 已提交讀:Read?committed | 語句級 | 避免 | 存在 | 存在 |
| 可重復讀 :Repeatable read | 事務級 | 避免 | 避免 | 存在 |
| 序列化:Serializable | 事務級 | 避免 | 避免 | 避免 |
2.1 Read Uncommitted
一個事務在執(zhí)行過程中可以看到其他事務沒有提交的新插入的記錄,而且能看到其他事務沒有提交的對已有記錄的更新。也稱為臟讀。
2.1.1 臟讀
讀臟數(shù)據(jù)指在不同的事務下,當前事務可以讀到另外事務未提交的數(shù)據(jù)。例如:事務T1更新了一行記錄的內容,但是并沒有提交所做的修改。事務T2讀取更新后的行,然后T1進行了回滾操作,取消了剛才所做的修改。現(xiàn)在T2讀到的之前T1修改的行則是無效的。(一個事務讀取了另一個事務未提交的數(shù)據(jù)) ?
2.2 Read Commit
一個事務在執(zhí)行過程中可以看到其他事務已經提交的新插入的記錄。也就是說一個事務從開始到提交之前對數(shù)據(jù)庫做的修改對其他事務都是不可見的。但是其他事務可以修改某個事務正在讀的行。因此,這一個隔離級別的設置解決了臟讀的問題,但是避免不了不可重復讀。?
2.2.1 不可重復讀
不可重復讀指在一個事務內多次讀取同一數(shù)據(jù)集合。在這一事務還未結束前,另一事務也訪問了該同一數(shù)據(jù)集合并做了修改,由于第二個事務的修改,第一次事務的兩次讀取的數(shù)據(jù)可能不一致。例如:T2?讀取一個數(shù)據(jù),T1?對該數(shù)據(jù)做了修改。如果 T2?再次讀取這個數(shù)據(jù),此時讀取的結果和第一次讀取的結果不同。
2.3 Repeatable Read
不能讀取已由其它事務修改了但是未提交的行,其它任何事務也不能修改在當前事務完成之前由當前事務讀取的數(shù)據(jù)。但是對于其它事務插入的新行數(shù)據(jù),當前事務第二次訪問表行時會檢索這一新行。因此,這一個隔離級別的設置解決了不可重復讀取的問題,但是避免不了幻讀。?
2.3.1 幻讀
事務T1讀取一條指定的Where子句所返回的結果集,然后事務T2事務新插入一行記錄,這行記錄恰好可以滿足T1所使用的查詢條件。然后T1再次對表進行檢索,但又看到了T2新插入的數(shù)據(jù)。?
2.4 Serializable
當數(shù)據(jù)庫系統(tǒng)使用序列化隔離級別時,不能讀取已由其它事務修改但是沒有提交的數(shù)據(jù),不允許其它事務在當前事務完成修改之前修改由當前事務讀取的數(shù)據(jù),不允許其它事務在當前事務完成修改之前插入新的行。一個事務在執(zhí)行過程中完全感覺不到其他事務對數(shù)據(jù)庫所做的更新。事務實際上以串行化方式運行。?這一個隔離級別的設置解決了幻讀的問題,也是最高的隔離級別。
3. 總結
本文介紹了數(shù)據(jù)庫事務是什么,事務的作用,事務有哪些特點,以及每個特點的含義是什么。在此基礎上介紹了數(shù)據(jù)庫的隔離級別,每一等級的隔離級別可以說是對數(shù)據(jù)庫事務的具體體現(xiàn)。
最后數(shù)據(jù)庫事務只是數(shù)據(jù)庫方面最基礎的一部分知識,除此之外,在數(shù)據(jù)庫的索引、范式部分也是面試會經常問到的知識,在下一次的更新中我將為大家?guī)頂?shù)據(jù)庫索引相關的內容,希望大家喜歡。
參考引用:
https://blog.csdn.net/qq_41511678/article/details/82873030
https://github.com/CyC2018/CS-Notes
總結
以上是生活随笔為你收集整理的datagrid只传入了一部分的数据 未显示全_软件开发面试之数据库事务篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米双 11 战报:全渠道支付金额破 2
- 下一篇: 桂花酿的功效与作用、禁忌和食用方法