事務的介紹
什麼是事務
當你需要一次執行多條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程式產生分散式事務。
相關文章
- 分散式事務介紹分散式
- Spring事務的介紹,以及基於註解@Transactional的宣告式事務Spring
- MySQL事務提交的三個階段介紹MySql
- seata分散式事務AT模式介紹(二)分散式模式
- rocketmq事務訊息入門介紹MQ
- TransactionScope事務處理方法介紹及.NETCore中的注意事項NetCore
- Spring 七種事務傳播性介紹Spring
- 分散式事務解決方案(一)【介紹】分散式
- 簡單介紹MySQL開啟事務的兩種方式MySql
- Java微服務下的分散式事務介紹及其解決方案2Java微服務分散式
- 常用的分散式事務解決方案介紹有多少種?分散式
- 基於可靠訊息方案的分散式事務:Lottor介紹分散式
- seata分散式事務TCC模式介紹及推薦實踐分散式模式
- silky微服務框架的服務治理介紹微服務框架
- SpringCloud包含的微服務介紹--EurekaSpringGCCloud微服務
- 選擇代理ip注意事項介紹
- 4.Rxjs介紹及注意事項JS
- AUTONOMOUS TRANSACTION(自治事務)的介紹(轉)
- TXC分散式事務簡介分散式
- Nginx服務詳細介紹Nginx
- 【Nacos】微服務配置中心介紹微服務
- JMS訊息服務介紹
- Storm介紹&實際開發注意事項ORM
- 微服務架構的特徵簡要介紹微服務架構特徵
- 探索Redis設計與實現14:Redis事務淺析與ACID特性介紹Redis
- 【微服務目錄】.NET Core 微服務介紹微服務
- dotnet core微服務框架Jimu介紹微服務框架
- 微服務 Spring cloud 各元件介紹微服務SpringCloud元件
- lms微服務框架主機介紹微服務框架
- Linux服務管理神器:SYSTEMD介紹Linux
- 服務端Swift Vagrant 工具介紹服務端Swift
- 微服務系列(二)GRPC的介紹與安裝微服務RPC
- silky微服務框架服務註冊中心介紹微服務框架
- 分散式事務(七)之Seata簡介分散式
- lms框架分散式事務使用簡介框架分散式
- 介紹一種對 SAP GUI 裡的收藏夾事務碼管理工具增強的實現方案GUI
- 關於Delta Lake的ACID事務機制簡介
- react-webcomponentify元件介紹、原碼分析、注意事項ReactWeb元件