2016年NIIT認證面試題精選

什麼是事務?四大事務特性是什麼?(ACID)

2016年NIIT認證面試題精選

事務是單個的工作單元。如果某一事務成功,則在該事務中進行的所有數據修改均會提交,成爲數據庫中的永久組成部分。如果事務遇到錯誤且必須取消或回滾,則所有數據修改均被清除。

舉個例子,比如你去銀行轉帳就是一個事務。轉帳可以簡單的分爲兩個步驟,一是把錢從你的帳戶中扣除,二是把錢存到你指定轉帳的帳戶中。這兩個步驟就是一個事務,必須全部執行,或是全部不執行。如果從你帳戶扣錢成功,但是轉帳失敗,那麼你轉帳的錢就沒有了;如果是扣錢失敗了,但是轉帳成功了,那銀行就虧了。

事務是作爲單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,稱爲原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成爲一個事務。

原子性:事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。

一致性:事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的'。

隔離:由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。事務識別數據時數據所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是第二個事務修改它之後的狀態,事務不會識別中間狀態的數據。這稱爲可串行性,因爲它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。

持久性:事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。

SQL Server 以下列事務模式運行。

自動提交事務:每條單獨的語句都是一個事務。

顯式事務:每個事務均以 BEGIN TRANSACTION 語句顯式開始,以 COMMIT 或 ROLLBACK 語句顯式結束。

隱式事務:在前一個事務完成時新事務隱式啓動,但每個事務仍以 COMMIT 或 ROLLBACK 語句顯式完成。

批處理級事務:只能應用於多個活動結果集 (MARS),在 MARS 會話中啓動的 Transact-SQL 顯式或隱式事務變爲批處理級事務。當批處理完成時沒有提交或回滾的批處理級事務自動由 SQL Server 進行回滾。

Sql Server中有三種使用事務的方法,分別是Sql語句,SqlTransaction和TransactionScope,下面一節將分別介紹這三種事務的使用方法。htt

事務(TRANSACTION)是作爲單個邏輯工作單元執行的一系列操作

q 這些操作作爲一個整體一起向系統提交,要麼都執行、要麼都不執行

q 事務是一個不可分割的工作邏輯單元

轉帳過程就是一個事務。

它需要兩條UPDATE語句來完成,這兩條語句是一個整體,如果其中任一條出現錯誤,則整個轉帳業務也應取消,兩個帳戶中的餘額應恢復到原來的數據,從而確保轉帳前和轉帳後的餘額不變,即都是1001元。

  事務的特性

事務必須具備以下四個屬性,簡稱ACID屬性:

•q原子性(Atomicity):事務是一個完整的操作。事務的各步操作是不可分的(原子的);要麼都執行,要麼都不執行

•q一致性(Consistency):當事務完成時,數據必須處於一致狀態

•q隔離性(Isolation):對數據進行修改的所有併發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務

•q永久性(Durability):事務完成後,它對數據庫的修改被永久保持,事務日誌能夠保持事務的永久性

  如何創建事務

q T-SQL使用下列語句來管理事務:

q 開始事務:BEGIN TRANSACTION

q 提交事務:COMMIT TRANSACTION

q 回滾(撤銷)事務:ROLLBACK TRANSACTION

一旦事務提交或回滾,則事務結束。

q 判斷某條語句執行是否出錯:

q 使用全局變量@@ERROR;

q @@ERROR只能判斷當前一條T-SQL語句執行是否有錯,爲了判斷事務中所有T-SQL語句是否有錯,我們需要對錯誤進行累計;

如: SET @errorSum=@errorSum+@@error

  瞭解事務的分類:

q 顯示事務:用BEGIN TRANSACTION明確指定事務的開始,這是最常用的事務類型

q 隱性事務:通過設置SET IMPLICIT_TRANSACTIONS ON 語句,將隱性事務模式設置爲打開,下一個語句自動啓動一個新事務。當該事務完成時,再下一個 T-SQL 語句又將啓動一個新事務

q 自動提交事務:這是 SQL Server 的默認模式,它將每條單獨的 T-SQL 語句視爲一個事務,如果成功執行,則自動提交;如果錯誤,則自動回滾

q 使用事務解決銀行轉帳問題

……關鍵語句講解………

BEGIN TRANSACTION

/*--定義變量,用於累計事務執行過程中的錯誤--*/

DECLARE @errorSum INT

SET @errorSum=0 --初始化爲0,即無錯誤

/*--轉帳:張三的帳戶少1000元,李四的帳戶多1000元*/

UPDATE bank SET currentMoney=currentMoney-1000

WHERE customerName='張三'

SET @errorSum=@errorSum+@@error

UPDATE bank SET currentMoney=currentMoney+1000

WHERE customerName='李四'

SET @errorSum=@errorSum+@@error --累計是否有錯誤

IF @errorSum<>0 --如果有錯誤

BEGIN

print '交易失敗,回滾事務'

ROLLBACK TRANSACTION

END

ELSE

BEGIN

print '交易成功,提交事務,寫入硬盤,永久的保存'

COMMIT TRANSACTION

END

Go

print '查看轉帳事務後的餘額'

SELECT * FROM bank

GO