七 設定隔離事務屬性

2021-09-01 13:05:49 字數 2201 閱讀 3666

1、當乙個應用程式或者不同應用程式中的多個事務在同乙個資料集上併發執行時,可能會出現許多意外的問題。必須指明希望事務間如何隔離。

2、併發事務所導致的問題可以分為下面3種型別

(1)髒讀:對於兩個事務t1和t2,t1讀取了乙個已經被t2更新但是還沒有被提交的字段。之後,如果t2回滾,t1讀取的內容就是臨時且無效的。

(2)不可重複讀:對於兩個事務t1和t2,t1讀取了乙個字段,然後t2更新了該字段。之後,t1再次讀取同乙個字段,值就不一樣了。

(3)幻讀:對於兩個事務t1和t2,t1從乙個表中讀取某幾行,然後t2在該表中插入一些新的行。之後,如果t1再次讀取同乙個表,就會多出幾行。

3、從理論上來說,事務應該彼此完全隔離(如按序列順序訪問),以避免上述的所有問題。然而,這種隔離級別會對效能產生巨大的影響,因為事務必須按順序執行。在實踐中,為了提公升效能,事務會以較低的隔離級別執行。

4、事務的隔離級別可以通過隔離事務屬性指定。spring支援5中隔離級別,這些隔離級別是在org.springframework.transaction.transactiondefinition介面中定義的。

default:使用底層資料庫的預設隔離級別。對於大多數資料庫來說,預設隔離級別都殺死read_commit。

read_uncommited:允許事務讀取未被其他事務提交的變更。髒讀、不可重複讀和幻讀問題都可能出現。

read_commited:只允許事務讀取已經被其他事務提交的變更。可以避免髒讀問題,但是不可重複讀和幻讀問題任然可能出現。

repeatable_read:確保事務可以多次從乙個欄位中讀取相同的值。在這個事務持續期間,禁止其他事務對這個字段進行更新。可以避免髒讀和不可重複讀問題,但是幻讀問題任然可能出現。

serializable:確保事務可以多次從乙個表中讀取相同的行。在這個事務持續期間,禁止其他事務對該錶執行插入、更新和刪除操作。所有併發性問題都可以避免,但是效能十分低下。

oracle 預設使用的是read committed,mysql預設事務隔離級別是repeatable read

5、@transactional(isolation=isolation.read_uncommited)

public void update(...)

@transactional

public void select(...)

update(...);//更新了,但未提交

tread.sleep(5000);

select(...)

//update方法又回滾

在上面的**中,由於update方法的事務隔離級別設定的是read_uncommited,所以update為提交的更新,select方法也能讀取到,就會出現髒讀。

將update方法的隔離級別改為:

@transactional(isolation=isolation.read_commited)

public void update(...)

再次執行**,select方法必須等待update回滾後才能讀取資料庫。

為了讓底層的資料庫可以支援read_commited隔離級別,它會在已經更新但沒有提交的行 上獲得更新鎖(update lock)。然後其他事務必須等待更新鎖被釋放後才能讀取該行,釋放發生在鎖定的事務提交或者回滾的時候。

@transactional(isolation=isolation.read_uncommited)

public void update(...)

@transactional(isolation=isolation.read_uncommited)

public void select(...)

select(...)//讀取了某欄位,但未提交

update(...);//更新了,且提交

tread.sleep(5000);

select(...)//再次讀取,值就不一樣了

在read_commited隔離級別中,另乙個事務能夠更新已經被未提交事務讀取過的值 。

@transactional(isolation=isolation.repeatable_read)

public void select(...)

為了讓底層的資料庫可以支援repeatable_read隔離級別,它在被讀取但還沒有被提交的行 上獲得讀取鎖(read lock)。然後其他事務必須等到讀取鎖被釋放後才能更新該行,釋放發生在鎖定的事務提交或者回滾的時候。

設定MySQL事務隔離級別

select tx isolation 檢視隔離級別 set transaction isolation level read uncommitted 設定讀未提交級別 start transaction 開啟事務 rollback 回滾 commit 提交 set transaction isol...

SpringBoot設定事務隔離等級

spring boot 使用事務非常簡單,首先使用註解 enabletransactionmanagement 開啟事務支援後,然後在訪問資料庫的service方法上新增註解 transactional 便可。在下文中會有圖例 關於事務管理器,不管是jpa還是jdbc等都實現自介面 platform...

事務隔離級別isolation設定

乙個事務讀取到另乙個事務中未提交的資料,另乙個事務中資料可能進行了改變,此時a事務讀取的資料可能和資料庫中資料時不一致的,此時認為資料是髒資料,讀取髒資料的過程就叫做髒讀。1.主要針對的是某行資料 2.主要針對的操作是修改操作 3.兩次讀取在同乙個事務內 當事務a第一次讀取事務後,事務b對事務a讀取...