Mysql事務結合spring管理

2022-05-17 18:39:11 字數 3941 閱讀 8459

spring事務相關問題記錄

遇到情況:

在本地單體應用除錯**時,發現在乙個加了@transaction註解的方法裡進行先更新後查詢的操作,查詢的結果是可以看到更新的內容的。而在微服務環境中同樣的**卻在後查詢時查不到前面更新的內容。

偽**如下:

@transactional

public void call()

猜測本地可以而微服務上不可以,估計是因為微服務在執行call()方法時,update操作是由biz服務呼叫的,而findbidplan()操作是實際是呼叫system服務進行的(該方法也有@transactional),故產生的是兩個事務。

處理辦法:

@autowired

private datasourcetransactionmanager transactionmanager;

public void call() catch (exception e)

}

隔離級別:

隔離級別定義乙個事務可能受其他併發事務活動活動影響的程度。另一種考慮乙個事務的隔離級別的方式,是把它想象為那個事務對於事物處理資料的自私程度。

在乙個典型的應用程式中,多個事務同時執行,經常會為了完成他們的工作而操作同乙個資料。併發雖然是必需的,但是會導致以下問題

隔離級別

含義isolation_default

使用後端資料庫預設的隔離級別。

isolation_read_uncommitted

允許讀取尚未提交的更改。可能導致髒讀、幻影讀或不可重複讀。

isolation_read_committed

允許從已經提交的併發事務讀取。可防止髒讀,但幻影讀和不可重複讀仍可能會發生。

isolation_repeatable_read(mysql預設隔離級別)

對相同欄位的多次讀取的結果是一致的,除非資料被當前事務本身改變。可防止髒讀和不可重複讀,但幻影讀仍可能發生。

isolation_serializable

完全服從acid的隔離級別,確保不發生髒讀、不可重複讀和幻影讀。這在所有隔離級別中也是最慢的,因為它通常是通過完全鎖定當前事務所涉及的資料表來完成的。

1.檢視當前會話隔離級別

select @@tx_isolation;
2.檢視系統當前隔離級別

select @@gobal.tx_isolation;
模擬read committed隔離級別下出現不可重複讀的狀況:

開啟乙個事務a進行三次查詢。事務b在事務a第一和第二次查詢中進行資料更新,事務b在事務a第二次和第三次查詢中進行事務提交。

mysql> set session transaction isolation level read committed; #設定當前會話事務的隔離級別為read committed

mysql> select @@tx_isolation; #查詢當前會話事務的隔離級別

+----------------+

| @@tx_isolation |

+----------------+

| read-committed |

+----------------+

mysql> start transaction; #開啟事務a

query ok, 0 rows affected (0.00 sec)

mysql> select * from t_user; #事務a第一次查詢 (1)

+----+------+----------+-------+

| id | name | password | phone |

+----+------+----------+-------+

| 1 | 張三 | 123 | 000 |

+----+------+----------+-------+

###################### 事務b進行更新操作 ##############################

mysql> select * from t_user; #事務a第二次查詢,沒有看到事務b沒有提交的更新操作。說明已經防止了髒讀問題。(3)

+----+------+----------+-------+

| id | name | password | phone |

+----+------+----------+-------+

| 1 | 張三 | 123 | 000 |

+----+------+----------+-------+

###################### 事務b進行事務提交 ##############################

mysql> select * from t_user; #觀察到事務b提交的結果,說明無法在同個事務中多次查詢值都是一樣的,即無法避免不可重複讀問題。(5)

+----+------+----------+-------+

| id | name | password | phone |

+----+------+----------+-------+

| 1 | 張三 | 123 | 123 |

+----+------+----------+-------+

mysql> start transaction; #開啟事務b 

mysql> update t_user set `phone` = '123' where id = 1; #進行更新操作(2)

mysql> commit; #提交事務b (4)

理解repeatable read 隔離級別下什麼是可重複讀:

開啟兩個事務。

mysql> begin;

mysql> select * from t_user; #(1)

+----+------+----------+-------+

| id | name | password | phone |

+----+------+----------+-------+

| 1 | 張三 | 123 | 188 |

+----+------+----------+-------+

###################### 事務b進行事務提交 ##############################

mysql> select * from t_user; #可觀察到兩次查詢結果都一樣,不會因為事務b的更新提交而有影響(3)

+----+------+----------+-------+

| id | name | password | phone |

+----+------+----------+-------+

| 1 | 張三 | 123 | 188 |

+----+------+----------+-------+

mysql> begin;

mysql> update `t_user` set `phone` = '8888'; #(2)

mysql> commit; #(2)

雖然該隔離級別下是,無論事務b進行更新、新增、刪除,在事務a中仍然可以重複讀到相同值的。

但是如果事務a進行更新操作,則可以對事務b新增的資料進行直接更新。

mysql事務和spring事務傳播型別

1.事務特性asid 1 a原子性 事務中的操作要麼全部執行要麼全部不執行 執行中有異常會回滾事務前狀態 2 s一致性 事務執行完畢後資料要保持一致 舉例 事務執行前a b的存款都是100,事務內容是a轉賬b,則事務執行完成之後,需要滿足a和b的存款和還是200。3 隔離性 不同的事物之間不會干擾 ...

Spring 事務 事務控制

0 註解 autowire 自動注入 url url b 1 spring專案中事務手動回滾 b transactionaspectsupport.currenttransactionstatus setrollbackonly 或者丟擲異常 transactional rollbackfor pu...

初學DWR 結合Spring

dwr2.0.5版本結合spring2.5.5 官方參考文件 1.配置web.xml 跟原先差不多,只是標籤servlet class的變化 org.directwebremoting.spring.dwrspringservlet2.配置spring的xml檔案 配置名字空間 the config...