SQLServer之事務簡介

2021-08-31 06:50:48 字數 3887 閱讀 8591

事務是單個的工作單元。事務是在資料庫上按照一定的邏輯順序執行的任務序列,既可以由使用者手動執行,也可以由某種資料庫程式自動執行。

每條單獨的語句都是乙個事務。

在自動提交模式下, 每個資料庫操作是在執行時已提交的事務。 此模式適合用於包含單個 sql 語句的許多實際的事務。 不需要分隔,或者指定的這些事務完成。 在資料庫中不支援事務的情況下,自動提交模式是唯一支援的模式。 在此類資料庫語句僅在提交後可以執行它們並沒有方法回滾它們;它們因此始終處於自動提交模式。

如果遵循基礎 dbms 不支援自動提交模式下事務,該驅動程式可以模擬它們通過手動提交每個 sql 語句,因為它執行。

如果在自動提交模式下執行一批 sql 語句,則它是資料來源特定的語句批處理中提交時。 它們可以是已提交會在執行時或作為乙個整體後執行整個批處理。 某些資料來源可能支援這兩個這些行為,並且可能會提供一種方法選擇乙個或其他人。 具體而言,如果批處理過程中發生錯誤,則資料來源特定於已執行語句是提交還是回滾。 因此,使用批次,且需要它們來提交或回滾作為乙個整體的可互操作應用程式應僅在手動提交模式下執行批處理。

每個事務均以 begin transaction 語句顯式開始,以 commit 或 rollback 語句顯式結束。

在前乙個事務完成時新事務隱式啟動,但每個事務仍以 commit 或 rollback 語句顯式完成。

隱式事務通過設定set implicit_transactions  on 語句,將隱性事務模式設定為開啟。

事務是作為單個邏輯工作單元執行的一系列操作。乙個邏輯工作單元必須有四個屬性,稱為原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)屬性,只有這樣才能成為乙個事務。

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

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

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

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

隔離級別用於決定如何控制併發使用者讀寫資料的操作。

讀操作預設使用共享鎖;寫操作需要使用排它鎖。

讀操作能夠控制他的處理的方式,寫操作不能控制它的處理方式。

理想情況下,事務應可序列化。 事務被視為可用作按順序執行它們的結果的同時執行的事務的結果是相同的情況下序列化 — 即,另乙個。 它並不重要的事務,則首先執行,僅的結果不會反映任何混合的事務。

事務隔離級別隔離成功事務的範圍內的一種度量值。 具體而言,事務隔離級別定義由存在以下現象:

根據這些現象定義四個事務隔離級別 (如 sql-92 所定義)。 下表中"x"將標記每個可能發生的現象。

事務不是相互隔離的。 如果 dbms 支援其他事務隔離級別,它會忽略它使用來實現這兩種級別的任何機制。 以便它們不產生不利影響其他事務,在 read uncommitted 級別執行的事務是通常是唯讀的。

在事務等待,直到由其他事務寫入鎖定的行不會被鎖定;這可以防止它讀取任何"更新"的資料。

事務持有讀取的鎖 (如果它僅讀取行) 或寫入鎖定 (如果它更新或刪除的行) 的當前行,以防止其他事務更新或刪除它。 事務釋放讀的鎖時即會關閉當前行。 它保留寫鎖,直到提交或回滾。

在事務等待,直到由其他事務寫入鎖定的行不會被鎖定;這可以防止它讀取任何"更新"的資料。

事務持有讀取的鎖,它返回到的應用程式和寫鎖,它插入、 更新或刪除的所有行的所有行。 例如,如果事務包含的 sql 語句選擇*從訂單,如應用程式讀取它們的事務讀取鎖定行。 如果在事務中包含的 sql 語句刪除從訂單的狀態 = 已關閉,如將其刪除的行事務寫入鎖。

由於其他事務不能更新或刪除這些行,當前事務可以避免任何不可重複讀取。 事務提交或回滾時釋放其鎖。

在事務等待,直到由其他事務寫入鎖定的行不會被鎖定;這可以防止它讀取任何"更新"的資料。

事務持有讀取的鎖 (如果它僅讀取的行) 或寫入鎖 (如果它可以更新或刪除行) 的範圍上它的行影響。 例如,如果事務包含的 sql 語句選擇*從訂單,範圍是整個 orders 表; 事務讀取鎖定表而不會允許任何新行插入到它。 如果在事務中包含的 sql 語句刪除從訂單的狀態 = 已關閉,範圍為"已關閉"狀態的所有行; 事務寫入鎖訂單中的所有行具有都表狀態為"closed"而不會不允許任何行要插入或更新,以便得到的行的狀態為"已關閉"。

由於其他事務不能更新或刪除範圍中的行,當前事務可以避免任何不可重複讀取。 由於其他事務不能在範圍中插入任何行,當前事務可以避免任何幻影。 事務提交或回滾時釋放其鎖定。

若要設定事務隔離級別,應用程式,請使用 sql_attr_txn_isolation 連線屬性。 如果資料來源不支援所請求的隔離級別,則驅動程式或資料來源可以設定更高的級別。 若要確定哪些事務隔離級別的資料來源支援和預設隔離級別是,應用程式呼叫sqlgetinfosql_txn_isolation_option 和 sql_default_txn_isolation 選項分別。

更高版本的事務隔離級別提供資料庫資料的大多數完整性的保護。 可序列化事務都保證是不受其他事務的影響,因此保證維護資料庫的完整性。

但是,更高版本的事務隔離級別可能導致效能下降,因為它增加了應用程式必須等待鎖釋放的資料的可能性。 應用程式可以指定較低階別的隔離,以提高效能,在以下情況下:

下表列出了用於管理更改的可見性的因素。

下表總結了每種游標型別能夠檢測所本身、 其自己的事務中的其他操作和其他事務所做的更改。 後一種更改的可見性取決於游標型別和包含游標的事務的隔離級別。

[a] 中括號的字母指示包含游標的事務的隔離級別(在其中進行了更改) 的其他事務的隔離級別是不相關。

ru: 未提交的讀

rc: 已提交讀

rr: 可重複讀

s: 可序列化

[b] 依賴於如何實現游標。 游標是否可以檢測此類更改通過中的 sql_static_sensitivity 選項將報告sqlgetinfo。

事務支援

sql server 的 ole db 驅動程式實現本地事務的支援。 使用者可借助 microsoft 分布式事務處理協調器 (ms dtc) 來使用分布式事務或協調事務。 對於需要跨多個會話的事務控制權的使用者,適用於 sql server 的 ole db 驅動程式可以加入由 ms dtc 啟動和維護的事務。

預設情況下,適用於 sql server 的 ole db 驅動程式使用自動提交事務模式,其中對使用者會話執行的每次離散操作均包含乙個針對 sql server 例項的完整事務。 適用於 sql server 的 ole db 驅動程式的自動提交模式是本地的,並且自動提交事務從不會跨多個會話。

適用於 sql server 的 ole db 驅動程式公開 itransactionlocal 介面,並允許使用者在 sql server 例項的單個連線上使用顯式和隱式啟動事務。 sql server 的 ole db 驅動程式不支援巢狀本地事務。

確保資料完整、安全、一致性。

確保執行緒之間操作不會相互影響。

原子性、一致性、永續性通過資料庫日誌實現。

批處理資料庫操作。

保證資料庫級聯操作的正確性。

執行較慢。

需要較多的磁碟空間儲存事務日誌。

執行更新需要記憶體較多。

Sql Server資料庫實驗之事務與鎖

李偉 select borrnum borrnum from borrow order by borrnum 1select bno bno from book where btitle 資料結構 select num count bno from borrow where bno bno and ...

併發之事務隔離

資料庫帶來的併發問題包括 1 丟失更新 2 髒讀 3 非重複讀 4 覆蓋更新 5 幻象讀 撤銷乙個事務時,把其他事務已提交的更新資料覆蓋 a和 b事務併發執行,a事務執行更新後,提交 b事務在 a事務更新後,b事務結束前也做了對該行資料的更新操作,然後回滾,則兩次更新操作都丟失了 乙個事務讀到另乙個...

Redis之事務案例

一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。乙個佇列中,一次性 順序性 排他性的執行一系列命令。單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷 沒有隔離...