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...