事務的介紹

楓^發表於2020-12-24

什麼是事務

當你需要一次執行多條SQL語句時,可以使用事務。通俗一點說,如果這幾條SQL語句全部執行成功,則才對資料庫進行一次更新,如果有一條SQL語句執行失敗,則這幾條SQL全部不不進行執行,這個時候需要用到事務(回滾)。

劉德華《無間道》:去不了終點,回到原點

資料庫的四大特性ACID

原子性( Atomicity)

  • 要麼都執行,要麼都不執行

一致性(Consistency)

  • 資料前後的資料都是正確的

隔離性(Isolation)

  • 事物之間相互隔離,互不干擾(併發執行的事務彼此無法看到對方的中間狀態)

永續性(Durabilty)

  • 事務一旦提交不可再回滾

本地事務

在計算機系統中,更多的是通過關型資料庫來控制事務,這是利用資料庫本身的事務特性來實現的,因此叫資料庫事務,由於應用主要靠關聯式資料庫來控制事務,而資料庫通常和應用在同一個伺服器,所以基於關型資料庫的事務又被稱為本地事務。

資料庫本身控制事務

//啟動事務
begin transaction:
		//1.本地資料庫操作,張三減少金額
		//2.本地資料庫操作,李四增加金額
//回滾
rollback;//提交事務
commit transation;

jdbc中使用事務

1.獲取資料庫連結
2.設定事務不自動提交(預設情況是自動提交的)

conn.setAutoCommit(falst); //其中conn是獲取的隨資料庫的連線物件。

3.把想要一次性提交的幾個sql語句用事務進行提交

try{
    Statement stmt = null; 
    stmt =conn.createStatement(); 
    stmt.executeUpdate(sql1); 
    int a=6/0;
    stmt.executeUpdate(Sql2); 
    . 
    . 
    . 
    conn.commit();   //使用commit提交事務 
}

4.捕獲異常,進行資料的回滾(回滾一般寫在catch塊中)

catch(Exception e) { 
   ... 
   conn.rollback(); 
}

1.2.3.aop控制事務:

1.配置事務管理器

<!--增強:配置事務管理器  -->
<bean id="tm"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
</bean>

2.配置事務的通知

<!--配置事務的通知(增強)  -->
<tx:advice id="txAdvice" transaction-manager="tm">
    <!--配置事務的傳播行為  -->
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="del*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>

3.配置切面

<!--配置切面:把增強應用到切點上  -->
<aop:config>
   <!--切點 --> 
   <aop:pointcut expression="execution(* com.usian.service.*.*(..))" id="pointcut"/>
   <!--切面 -->
   <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>

1.3.分散式事務

隨著網際網路的快速發展,軟體系統由原來的單體應用轉變為分散式應用,下圖描述了單體應用向微服務的演變:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Uw4ppLQo-1608781901257)(assets\1591185975523.png)]

分散式系統會把一個應用系統拆分為可獨立部署的多個服務,因此需要服務與服務之間遠端協作才能完成事務操作,這種分散式系統環境下由不同的服務之間通過網路遠端協作完成事務稱之為分散式事務,例如使用者註冊送積分事務、建立訂單減庫存事務,銀行轉賬事務等都是分散式事務。

我們知道本地事務依賴資料庫本身提供的事務特性來實現,因此以下邏輯可以控制本地事務:

begin transaction;
      //1.本地資料庫操作:張三減少金額
      //2.本地資料庫操作:李四增加金額
commit transation;

但是在分散式環境下,會變成下邊這樣:

begin transaction;
       //1.本地資料庫操作:張三減少金額
       //2.遠端呼叫:讓李四增加金額
commit transation;

可以設想,當遠端呼叫讓李四增加金額成功了,由於網路問題遠端呼叫並沒有返回,此時本地事務提交失敗就回滾了張三減少金額的操作,此時張三和李四的資料就不一致了。

因此在分散式架構的基礎上,傳統資料庫事務就無法使用了,張三和李四的賬戶不在一個資料庫中甚至不在一個應用系統裡,實現轉賬事務需要通過遠端呼叫,由於網路問題就會導致分散式事務問題。

1.4.分散式事務產生的場景

1、典型的場景就是微服務架構 微服務之間通過遠端呼叫完成事務操作。 比如:訂單微服務和庫存微服務,下單的同時訂單微服務請求庫存微服務減庫存。簡言之:跨JVM程式產生分散式事務。
在這裡插入圖片描述

2、單體系統訪問多個資料庫例項 當單體系統需要訪問多個資料庫(例項)時就會產生分散式事務。 比如:使用者資訊和訂單資訊分別在兩個MySQL例項儲存,使用者管理系統刪除使用者資訊,需要分別刪除使用者資訊及使用者的訂單資訊,由於資料分佈在不同的資料例項,需要通過不同的資料庫連結去運算元據,此時產生分散式事務。 簡言之:跨資料庫例項產生分散式事務。
在這裡插入圖片描述

3、多服務訪問同一個資料庫例項 比如:訂單微服務和庫存微服務即使訪問同一個資料庫也會產生分散式事務,兩個微服務持有了不同的資料庫連結進行資料庫操作,此時產生分散式事務。簡言之:跨JVM程式產生分散式事務。

在這裡插入圖片描述

相關文章