話說事務相關知識

2021-12-29 21:10:22 字數 4233 閱讀 5824

1.1 事務的四大特性cuid

事務(transaction)是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。

事務通常是以begin transaction開始,以commit或rollback結束。

commit表示提交,即提交事務的所有操作。具體地說就是將事務中所有對資料庫的更新寫回到磁碟上的物理資料庫中去,事務正常結束。

rollback表示回滾,即在事務執行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對資料庫的所有以完成的操作全部撤消,滾回到事務開始的狀態。

事務的特性(acid特性)

a:原子性(atomicity)

事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。

b:一致性(consistency)

事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。

c:隔離性(isolation)

乙個事務的執行不能被其他事務干擾。

d:持續性/永久性(durability)

乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。

1.2 jdbc中的資料隔離級別

如果dbms支援事務處理,它必須有某種途徑來管理兩個事務同時對乙個資料庫進行操作時可能發生的衝突。使用者可指定事務隔離級別,以指明dbms應該花多大精力來解決潛在衝突。例如,當事務更改了某個值而第二個事務卻在該更改被提交或還原前讀取該值時該怎麼辦。

假設第乙個事務被還原後,第二個事務所讀取的更改值將是無效的,那麼是否可允許這種衝突?jdbc使用者可用以下**來指示dbms允許在值被提交前讀取該值(」dirty讀取」),其中con是當前連線:

con.settransactionisolation(transaction_read_uncommitted);

事務隔離級別越高,為避免衝突所花的精力也就越多。connection介面定義了五級,其中最低級別指定了根本就不支援事務,而最高端別則指定當事務 在對某個資料庫進行操作時,任何其它事務不得對那個事務正在讀取的資料進行任何更改。通常,隔離級別越高,應用程式執行的速度也就越慢(由於用於鎖定的資 源耗費增加了,而使用者間的併發操作減少了)。在決定採用什麼隔離級別時,開發人員必須在效能需求和資料一致性需求之間進行權衡。當然,實際所能支援的級別 取決於所涉及的dbms的功能。

當建立connection物件時,其事務隔離級別取決於驅動程式,但通常是所涉及的資料庫的預設 值。使用者可通過呼叫setisolationlevel方法來更改事務隔離級別。新的級別將在該連線過程的剩餘時間內生效。要想只改變乙個事務的事務隔離 級別,必須在該事務開始前進行設定,並在該事務結束後進行復位。我們不提倡在事務的中途對事務隔離級別進行更改,因為這將立即觸發commit方法的調 用,使在此之前所作的任何更改變成永久性的。

jdbc的資料隔離級別設定:

jdbc 資料庫隔離級別 資料訪問情況

transaction_read_uncommitted ur 就是俗稱「髒讀」(dirty read),在沒有提交資料時能夠讀到已經更新的資料

transaction_read_committed cs 在乙個事務中進行查詢時,允許讀取提交前的資料,資料提交後,當前查詢就可以讀取到資料。update資料時候並不鎖住表

transaction_repeatable_read rs 在乙個事務中進行查詢時,不允許讀取其他事務update的資料,允許讀取到其他事務提交的新增資料

transaction_serializable rr 在乙個事務中進行查詢時,不允許任何對這個查詢表的資料修改。

1.2.1 jdbc事務隔離級別

為了解決與「多個執行緒請求相同資料」相關的問題,事務之間用鎖相互隔開。多數主流的資料庫支援不同型別的鎖;因此,jdbc api 支援不同型別的事務,它們由 connection 物件指派或確定。在 jdbc api 中可以獲得下列事務級別:

transaction_none 說明不支援事務。

transaction_read_uncommitted 說明在提交前乙個事務可以看到另乙個事務的變化。這樣髒讀、不可重複的讀和虛讀都是允許的。

transaction_read_committed 說明讀取未提交的資料是不允許的。這個級別仍然允許不可重複的讀和虛讀產生。

transaction_repeatable_read 說明事務保證能夠再次讀取相同的資料而不會失敗,但虛讀仍然會出現。

transaction_serializable 是最高的事務級別,它防止髒讀、不可重複的讀和虛讀。

為了在效能與一致性之間尋求平衡才出現了上面的幾種級別。事務保護的級別越高,效能損失就越大。

假定您的資料庫和 jdbc 驅動程式支援這個特性,則給定乙個 connection 物件,您可以明確地設定想要的事務級別:

conn.settransactionlevel(transaction_serializable) ;

可以通過下面的方法確定當前事務的級別:

int level = conn.gettransactionisolation();

if(level == connection.transaction_none)

system.out.println("transaction_none");

else if(level == connection.transaction_read_uncommitted)

system.out.println("transaction_read_uncommitted");

else if(level == connection.transaction_read_committed)

system.out.println("transaction_read_committed");

else if(level == connection.transaction_repeatable_read)

system.out.println("transaction_repeatable_read");

else if(level == connection.transaction_serializable)

system.out.println("transaction_serializable");

1.3 spring中的事務隔離級別

使用aop配置事務的時候,除了預設的隔離級別其它四種是和jdbc中的隔離級別相對應的

isolation[?a?s??le???n] 隔離: 屬性一共支援五種事務設定,具體介紹如下:

1、 default 使用資料庫設定的隔離級別 ( 預設 ) ,由 dba 預設的設定來決定隔離級別 .

2、read_uncommitted 會出現髒讀、不可重複讀、幻讀 ( 隔離級別最低,併發效能高 )

3、read_committed 會出現不可重複讀、幻讀問題(鎖定正在讀取的行)

4、repeatable_read 會出幻讀(鎖定所讀取的所有行)

5、serializable 保證所有的情況不會發生(鎖表)

1.4 事務的傳播特性propagation

propagation_required: 如果存在乙個事務,則支援當前事務。如果沒有事務則開啟 propagation_supports: 如果存在乙個事務,支援當前事務。如果沒有事務,則非事務的執行 propagation_mandatory: 如果已經存在乙個事務,支援當前事務。如果沒有乙個活動的事務,則丟擲異常。 propagation_requires_new: 總是開啟乙個新的事務。如果乙個事務已經存在,則將這個存在的事務掛起。 propagation_not_supported: 總是非事務地執行,並掛起任何存在的事務。 propagation_never: 總是非事務地執行,如果存在乙個活動事務,則丟擲異常 propagation_nested:如果乙個活動的事務存在,則執行在乙個巢狀的事務中. 如果沒有活動事務, 則按transactiondefinition.propagation_required 屬性執行

1.5 主流資料庫預設的隔離級別

oracle裡支援的隔離級別:read committed/serializable,預設的是read committed mysql支援的隔離級別:read uncommitted/read committed/repeatable read/serializable,預設的是repeatable read;

事務相關知識總結

事務是邏輯上的一組操作,要麼都執行,要麼都不執行。事務最經典也經常被拿出來說例子就是轉賬了。假如小明要給小紅轉賬1000元,這個轉賬會涉及到兩個關鍵操作就是 將小明的餘額減少1000元,將小紅的餘額增加1000元。萬一在這兩個操作之間突然出現錯誤比如銀行系統崩潰,導致小明餘額減少而小紅的餘額沒有增加...

事務 相關知識點

1.關閉自動提交功能。2.演示事務 裡面的事務,主要是針對連線來的。1.通過 x.setautocommit false 來關閉自動提交的設定。2.提交事務 x.commit 3.回滾事務 x.rollback test public void testtransaction catch sqlex...

事務相關知識點

原子性 atomicity 事務中所有操作是不可再分割的原子單位。事務中所有操作要麼全部執行成功,要麼全部執行失敗。一致性 consistency 事務執行後,資料庫狀態與其它業務規則保持一致。如轉賬業務,無論事務執行成功與否,參與轉賬的兩個賬號餘額之和應該是不變的。隔離性 isolation 隔離...