事務
事務是什麼?
(同生共死)
事務解決什麼問題?
簡單的提乙個小例子,就轉賬,先把你錢扣掉了,但中途發生點不可抗拒的因素,結果沒轉過去,那麼如果沒有回滾,那麼你就白白損失這錢,如果銀行先給那個人轉達了,但中途發生點問題,你的錢沒扣,那銀行損失慘重,所以這就需要事務,要麼都執行,要麼都不執行
事務的四個特性:
原子性:都要確保不可再分的最小單元
一致性:指的是結果要麼都成功提交,要麼都回滾,一致的
永續性:事務完成後,會永久的儲存到資料庫,而不是說你今天有,明天就沒了
隔離性:多個事務之間互不影響
併發事務會造成的問題:
第一類丟失更新:撤銷乙個事務時,把其他事務已提交的更新資料覆蓋。
第二類丟失更新:是不可重複讀的特殊情況。如果兩個事物都讀取同一行,然後兩個都進行寫操作,並提交,第乙個事物所做的改變就會丟失。
髒讀:乙個事務讀取到另乙個事務未提交的更新資料。
幻讀也叫虛讀:乙個事務執行兩次查詢,第二次結果集包含第一次中沒有或某些行已經被刪除的資料,造成兩次結果不一致,只是另乙個事務在這兩次查詢中間插入或刪除了資料造成的。
不可重複讀:乙個事務兩次讀取同一行的資料,結果得到不同狀態的結果,中間正好另乙個事務更新了該資料,兩次結果相異,不可被信任。
事物的四個
如何解決這些問題?answer:事物的隔離級別
① serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。
② repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
③ read committed (讀已提交):可避免髒讀的發生。
④ read uncommitted (讀未提交):最低級別,任何情況都無法保證。
其中sql server和oracle是讀已提交,mysql是可重複讀,他們隔離級別不同,效能也不同,隨然序列化避免的問題最多,但是效能太差,大多數時候要根據實際業務進行取捨
事務的七個傳播行為:
1、propagation_required:如果當前沒有事務,就建立乙個新事務,如果當前存在事務,就加入該事務,該設定是最常用的設定。
2、propagation_supports:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。『
3、propagation_mandatory:支援當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就丟擲異常。
4、propagation_requires_new:建立新事務,無論當前存不存在事務,都建立新事務。
5、propagation_not_supported:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
6、propagation_never:以非事務方式執行,如果當前存在事務,則丟擲異常。
7、propagation_nested:如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。
在mysql中如何檢視事物的隔離級別:
select @@tx_isolation;在mysql中如何修改事務的隔離級別:
set [global | session] transaction isolation level如果寫global就是全域性
如果是session就是當前回話
Spring開發基礎之Spring事務管理
spring提供的事務管理 spring提供的事務管理可以分為兩類 程式設計式的和宣告式的。程式設計式的,比較靈活,但是 量大,存在重複的 比較多 宣告式的比程式設計式的更靈活。傳統使用jdbc的事務管理 以往使用jdbc進行資料操作,使用datasource,從資料來源中得到connection,...
spring中事務詳解
文章 使用步驟 步驟一 在spring配置檔案中引入命名空間 id defaulttransactionmanager class org.springframework.orm.hibernate3.hibernatetransactionmanager name sessionfactory r...
spring中事務配置
1 如果在方法 類 介面上使用註解的方式宣告事務,需要在配置檔案中進行配置,以便通知 spring 容器對標註 transactional 註解的 bean 加工處理。首先需要引入 tx 命名空間,2 transactional 註解可以被應用於介面定義和介面方法 類定義和類的 public 方法上...