SQLServer之事务简介
事務(wù)定義
事務(wù)是單個的工作單元。事務(wù)是在數(shù)據(jù)庫上按照一定的邏輯順序執(zhí)行的任務(wù)序列,既可以由用戶手動執(zhí)行,也可以由某種數(shù)據(jù)庫程序自動執(zhí)行。
事務(wù)分類
自動提交事務(wù)
每條單獨的語句都是一個事務(wù)。
在自動提交模式下,?每個數(shù)據(jù)庫操作是在執(zhí)行時已提交的事務(wù)。?此模式適合用于包含單個 SQL 語句的許多實際的事務(wù)。?不需要分隔,或者指定的這些事務(wù)完成。?在數(shù)據(jù)庫中不支持事務(wù)的情況下,自動提交模式是唯一支持的模式。?在此類數(shù)據(jù)庫語句僅在提交后可以執(zhí)行它們并沒有方法回滾它們;它們因此始終處于自動提交模式。
如果遵循基礎(chǔ) DBMS 不支持自動提交模式下事務(wù),該驅(qū)動程序可以模擬它們通過手動提交每個 SQL 語句,因為它執(zhí)行。
如果在自動提交模式下執(zhí)行一批 SQL 語句,則它是數(shù)據(jù)源特定的語句批處理中提交時。?它們可以是已提交會在執(zhí)行時或作為一個整體后執(zhí)行整個批處理。?某些數(shù)據(jù)源可能支持這兩個這些行為,并且可能會提供一種方法選擇一個或其他人。?具體而言,如果批處理過程中發(fā)生錯誤,則數(shù)據(jù)源特定于已執(zhí)行語句是提交還是回滾。?因此,使用批次,且需要它們來提交或回滾作為一個整體的可互操作應(yīng)用程序應(yīng)僅在手動提交模式下執(zhí)行批處理。
顯式事務(wù)
每個事務(wù)均以 BEGIN TRANSACTION 語句顯式開始,以 COMMIT 或 ROLLBACK 語句顯式結(jié)束。
隱式事務(wù)
在前一個事務(wù)完成時新事務(wù)隱式啟動,但每個事務(wù)仍以 COMMIT 或 ROLLBACK 語句顯式完成。
隱式事務(wù)通過設(shè)置SET IMPLICIT_TRANSACTIONS? ON?語句,將隱性事務(wù)模式設(shè)置為打開。
事務(wù)特性
事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列操作。一個邏輯工作單元必須有四個屬性,稱為原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)屬性,只有這樣才能成為一個事務(wù)。
原子性
事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。
一致性
事務(wù)在完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時,所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如 B 樹索引或雙向鏈表)都必須是正確的。
隔離性
由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改隔離。事務(wù)識別數(shù)據(jù)時數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是第二個事務(wù)修改它之后的狀態(tài),事務(wù)不會識別中間狀態(tài)的數(shù)據(jù)。這稱為可串行性,因為它能夠重新裝載起始數(shù)據(jù),并且重播一系列事務(wù),以使數(shù)據(jù)結(jié)束時的狀態(tài)與原始事務(wù)執(zhí)行的狀態(tài)相同。
持久性
事務(wù)完成之后,它對于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)系統(tǒng)故障也將一直保持。
事務(wù)隔離
隔離級別用于決定如何控制并發(fā)用戶讀寫數(shù)據(jù)的操作。
讀操作默認使用共享鎖;寫操作需要使用排它鎖。
讀操作能夠控制他的處理的方式,寫操作不能控制它的處理方式。
可序列化性
理想情況下,事務(wù)應(yīng)可序列化。?事務(wù)被視為可用作按順序運行它們的結(jié)果的同時運行的事務(wù)的結(jié)果是相同的情況下序列化 — 即,另一個。?它并不重要的事務(wù),則首先執(zhí)行,僅的結(jié)果不會反映任何混合的事務(wù)。
事務(wù)隔離級別
事務(wù)隔離級別隔離成功事務(wù)的范圍內(nèi)的一種度量值。?具體而言,事務(wù)隔離級別定義由存在以下現(xiàn)象:
-
臟讀A臟讀事務(wù)讀取尚未提交的數(shù)據(jù)時發(fā)生。?例如,假設(shè)事務(wù) 1 更新行。?事務(wù) 2 在事務(wù) 1 提交更新之前讀取更新的行。?如果事務(wù) 1 回滾更改,將具有事務(wù) 2 讀取永遠不會視為已存在于數(shù)據(jù)。
-
不可重復讀取A不可重復讀事務(wù)兩次讀取同一行,但每次獲取不同的數(shù)據(jù)時發(fā)生。?例如,假設(shè)事務(wù) 1 讀取某行。?事務(wù) 2 更新或刪除該行并提交 update 或 delete。?如果事務(wù) 1 重新讀取行,它將檢索不同的行值或發(fā)現(xiàn)該行已被刪除。
-
幻影A幻像是與搜索條件匹配,但是最初未檢測到的行。?例如,假設(shè)事務(wù) 1 讀取一組滿足某些搜索條件的行。?事務(wù) 2 生成一個新行 (通過更新或插入) 事務(wù) 1 搜索條件相匹配。?如果事務(wù) 1 reexecutes 讀取這些行的語句,它獲取一組不同的行。
- 更新丟失,兩個事務(wù)同時更新,但由于某一個事務(wù)更新失敗發(fā)生回滾操作,這樣有可能的結(jié)果就是第二個事務(wù)已更新的數(shù)據(jù)因為第一個事務(wù)發(fā)生回滾而導致數(shù)據(jù)最終沒有發(fā)生更新,因此兩個事務(wù)的更新都失敗了。
根據(jù)這些現(xiàn)象定義四個事務(wù)隔離級別 (如 SQL-92 所定義)。?下表中"X"將標記每個可能發(fā)生的現(xiàn)象。
事務(wù)隔離級別可能的實現(xiàn)
未提交讀
事務(wù)不是相互隔離的。?如果 DBMS 支持其他事務(wù)隔離級別,它會忽略它使用來實現(xiàn)這兩種級別的任何機制。?以便它們不產(chǎn)生不利影響其他事務(wù),在 Read Uncommitted 級別運行的事務(wù)是通常是只讀的。
已提交讀
在事務(wù)等待,直到由其他事務(wù)寫入鎖定的行不會被鎖定;這可以防止它讀取任何"更新"的數(shù)據(jù)。
事務(wù)持有讀取的鎖 (如果它僅讀取行) 或?qū)懭腈i定 (如果它更新或刪除的行) 的當前行,以防止其他事務(wù)更新或刪除它。?事務(wù)釋放讀的鎖時即會關(guān)閉當前行。?它保留寫鎖,直到提交或回滾。
可重復讀
在事務(wù)等待,直到由其他事務(wù)寫入鎖定的行不會被鎖定;這可以防止它讀取任何"更新"的數(shù)據(jù)。
事務(wù)持有讀取的鎖,它返回到的應(yīng)用程序和寫鎖,它插入、 更新或刪除的所有行的所有行。?例如,如果事務(wù)包含的 SQL 語句選擇*從訂單,如應(yīng)用程序讀取它們的事務(wù)讀取鎖定行。?如果在事務(wù)中包含的 SQL 語句刪除從訂單的狀態(tài) = 已關(guān)閉,如將其刪除的行事務(wù)寫入鎖。
由于其他事務(wù)不能更新或刪除這些行,當前事務(wù)可以避免任何不可重復讀取。?事務(wù)提交或回滾時釋放其鎖。
可序列化
在事務(wù)等待,直到由其他事務(wù)寫入鎖定的行不會被鎖定;這可以防止它讀取任何"更新"的數(shù)據(jù)。
事務(wù)持有讀取的鎖 (如果它僅讀取的行) 或?qū)懭腈i (如果它可以更新或刪除行) 的范圍上它的行影響。?例如,如果事務(wù)包含的 SQL 語句選擇*從訂單,范圍是整個 Orders 表; 事務(wù)讀取鎖定表而不會允許任何新行插入到它。?如果在事務(wù)中包含的 SQL 語句刪除從訂單的狀態(tài) = 已關(guān)閉,范圍為"已關(guān)閉"狀態(tài)的所有行; 事務(wù)寫入鎖訂單中的所有行具有都表狀態(tài)為"CLOSED"而不會不允許任何行要插入或更新,以便得到的行的狀態(tài)為"已關(guān)閉"。
由于其他事務(wù)不能更新或刪除范圍中的行,當前事務(wù)可以避免任何不可重復讀取。?由于其他事務(wù)不能在范圍中插入任何行,當前事務(wù)可以避免任何幻影。?事務(wù)提交或回滾時釋放其鎖定。
設(shè)置事務(wù)隔離級別
若要設(shè)置事務(wù)隔離級別,應(yīng)用程序,請使用 SQL_ATTR_TXN_ISOLATION 連接屬性。?如果數(shù)據(jù)源不支持所請求的隔離級別,則驅(qū)動程序或數(shù)據(jù)源可以設(shè)置更高的級別。?若要確定哪些事務(wù)隔離級別的數(shù)據(jù)源支持和默認隔離級別是,應(yīng)用程序調(diào)用SQLGetInfoSQL_TXN_ISOLATION_OPTION 和 SQL_DEFAULT_TXN_ISOLATION 選項分別。
更高版本的事務(wù)隔離級別提供數(shù)據(jù)庫數(shù)據(jù)的大多數(shù)完整性的保護。?可序列化事務(wù)都保證是不受其他事務(wù)的影響,因此保證維護數(shù)據(jù)庫的完整性。
但是,更高版本的事務(wù)隔離級別可能導致性能下降,因為它增加了應(yīng)用程序必須等待鎖釋放的數(shù)據(jù)的可能性。?應(yīng)用程序可以指定較低級別的隔離,以提高性能,在以下情況下:
-
當它可以保證其他任何事務(wù)存在,可能會影響應(yīng)用程序的事務(wù)。?這種情況僅在有限的情況下,如小型公司中的某個人時維護 dBASE 文件包含一臺計算機上的人員數(shù)據(jù)中發(fā)生,不會共享這些文件。
-
當速度比準確性和任何錯誤很可能是小型更為重要。?例如,假設(shè)一家公司,使得許多小型銷售和大單銷售很少。?估計總銷售額值中所有打開的事務(wù)可以安全地使用 Read Uncommitted 隔離級別。?盡管該事務(wù)將包含訂單是得到打開或關(guān)閉,隨后可以回滾,這些將通常相互抵消,事務(wù)會快得多,因為它不會阻止每次它遇到這種訂單。
可滾動游標和事務(wù)隔離
下表列出了用于管理更改的可見性的因素。
| 游標 | 游標類型,游標實現(xiàn) |
| 同一個事務(wù)中的其他語句 | 游標類型 |
| 在其他事務(wù)中的語句 | 游標類型,事務(wù)隔離級別 |
?
?
?
?
?
?
下表總結(jié)了每種游標類型能夠檢測所本身、 其自己的事務(wù)中的其他操作和其他事務(wù)所做的更改。?后一種更改的可見性取決于游標類型和包含光標的事務(wù)的隔離級別。
?
[a] 中括號的字母指示包含游標的事務(wù)的隔離級別(在其中進行了更改) 的其他事務(wù)的隔離級別是不相關(guān)。
RU: 未提交的讀
RC: 已提交讀
RR: 可重復讀
S: 可序列化
[b] 依賴于如何實現(xiàn)游標。?光標是否可以檢測此類更改通過中的 SQL_STATIC_SENSITIVITY 選項將報告SQLGetInfo。
事務(wù)支持
SQL Server 的 OLE DB 驅(qū)動程序?qū)崿F(xiàn)本地事務(wù)的支持。?使用者可借助 Microsoft 分布式事務(wù)處理協(xié)調(diào)器 (MS DTC) 來使用分布式事務(wù)或協(xié)調(diào)事務(wù)。?對于需要跨多個會話的事務(wù)控制權(quán)的使用者,適用于 SQL Server 的 OLE DB 驅(qū)動程序可以加入由 MS DTC 啟動和維護的事務(wù)。
默認情況下,適用于 SQL Server 的 OLE DB 驅(qū)動程序使用自動提交事務(wù)模式,其中對使用者會話執(zhí)行的每次離散操作均包含一個針對?SQL Server?實例的完整事務(wù)。?適用于 SQL Server 的 OLE DB 驅(qū)動程序的自動提交模式是本地的,并且自動提交事務(wù)從不會跨多個會話。
適用于 SQL Server 的 OLE DB 驅(qū)動程序公開 ITransactionLocal 接口,并允許使用者在?SQL Server?實例的單個連接上使用顯式和隱式啟動事務(wù)。?SQL Server 的 OLE DB 驅(qū)動程序不支持嵌套本地事務(wù)。
事務(wù)應(yīng)用場景
確保數(shù)據(jù)完整、安全、一致性。
確保線程之間操作不會相互影響。
事務(wù)優(yōu)點
原子性、一致性、持久性通過數(shù)據(jù)庫日志實現(xiàn)。
批處理數(shù)據(jù)庫操作。
保證數(shù)據(jù)庫級聯(lián)操作的正確性。
事務(wù)缺點
執(zhí)行較慢。
需要較多的磁盤空間保存事務(wù)日志。
執(zhí)行更新需要內(nèi)存較多。
?
轉(zhuǎn)載于:https://www.cnblogs.com/vuenote/p/9913845.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的SQLServer之事务简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对做的一个小的C++聊天室的总结
- 下一篇: JQData数据提取及MySQL简单操作