數據庫事務

數據庫事務(簡稱:事務)是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。——百度、維基百科百科

一個數據庫事務通常包含了一個序列的對數據庫的讀/寫操作。它的存在包含有以下兩個目的:

  1. 爲數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
  2. 當多個應用程序在併發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。

       當事務被提交給了DBMS(數據庫管理系統),則DBMS(數據庫管理系統)需要確保該事務中的所有操作都成功完成且其結果被永久保存在數據庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態;同時,該事務對數據庫或者其他事務的執行無影響,所有的事務都好像在獨立的運行。

————————————————————————————————————————————————————————

小貓在愛奇藝首充6元:1、小貓支微信餘額減少6元  2、愛奇藝財務賬號金額增加6元 3、小貓獲得會員權限

小貓事務 愛奇藝事務
  開始事務(時刻等待用戶充值會員)
開始事務(打開支微信錢包開始剁手)  
1、小貓支微信餘額減少6元  
  2、愛奇藝財務賬號金額增加6元
  3、小貓獲得會員權限
提交事務  

小貓付錢了,愛奇藝莫得錢,也不會給小貓會員。這就是沒有將這些事件放在一個事務中處理,1執行成功,而2、3執行失敗,導致最終出現問題。將兩個放在一個事務中,事務成功則說明1、2、3都成功執行,事務失敗則1、2、3都失敗,這樣就不會出現金額的誤差。

————————————————————————————————————————————————————————

ACID性質

  1. 原子性(Atomicity):事務作爲一個整體被執行,包含在其中的對數據庫的操作要麼全部被執行,要麼都不執行。
  2. 一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變爲另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。
  3. 隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行。
  4. 持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中。

————————————————————————————————————————————————————————

併發操作異常

  1. 髒讀(Dirty-Reads):A事務對數據執行操作(100+1),A未提交,B事務讀取,此時B讀取數據還是未變(100);
  2. 不可重複讀(Not-Repeatable-Read):A事務重新讀取前面讀取過的數據(100),發現該數據已經被已提交的B事務修改(update)過數據值爲(100+1);
  3. 幻讀(Phantom Read):A事務重新執行一個查詢(value=100),返回一套符合條件的行(10),發現這些行因爲最近提交的B事務(insert或delete)而發生了改變,行爲(11或9);
  4. 回滾丟失(Rollback Lost):兩個事務對同一個數據進(100)行操作,A事務執行成功(100+1),數據改變(101);但B事務執行失敗(100+1),B事務回滾數據不變(100),最終數據爲100,數據丟失;
  5. 事務覆蓋(Transaction Coverage):A事務對數據執行操作(100+1),B事務對數據執行操作(100+2),A事務先提交,B事務後提交,最終數據爲(102),B事務覆蓋了A事務。

————————————————————————————————————————————————————————

隔離級別

讀未提交(Read Uncommitted):A事務更新數據未提交,B事務可以讀取到數據的改變

讀已提交(Read Committed):A事務更新數據未提交,B事務不可讀,A事務更新數據已提交,B事務可讀

可重複讀(Repeatable Read):保證A事務中重複讀取的數據是一樣的,讀或改數據時禁止寫【默認隔離級別】

序列化(Serializable):所有事務按序列執行,不允許併發事務執行,最安全,但是效率最慢

————————————————————————————————————————————————————————

Java處理事務

1.Java使用工具類連接代碼

connection.setTransactionlsolation(Connection.事務級別):MySql默認爲可重複讀
connection.setAutCommit(false):關閉事務自動提交
connection.commit():手動提交事務
connection.rollback():事務回滾

2.SpringBoot事務代碼

maven依賴
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.1.4.RELEASE</version>
</dependency>
啓動類註解
@EnableTransactionManagement:開啓事務管理



事務方法

@Transactional:事務註解
	//回滾
	@Transactional(rollbackFor=Exception.class):指定回滾
	@Transactional(noRollbackFor=Exception.class):指定不回滾
	
	@Transactional(propagation=Propagation.REQUIRED):如果有事務,那麼加入事務,沒有的話新建一個
	@Transactional (propagation = Propagation.REQUIRED,readOnly=true):readOnly=true只讀,不能更新、刪除
	@Transactional (propagation = Propagation.REQUIRED,timeout=10):timeout=10設置超時時間
	@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT):isolation=Isolation.DEFAULT設置隔離級別
	@Transactional(propagation=Propagation.NOT_SUPPORTED):容器不爲這個方法開啓事務

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章