儘量不要使用長事務
用於查找持續時間超過 60s 的事務
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
查看事務是否開啓
SELECT @@event_scheduler; 或 SHOW PROCESSLIST; 或 SHOW VARIABLES LIKE 'event_scheduler';
開始MySQL事務執行
SET GLOBAL event_scheduler = 1; 或 SET GLOBAL event_scheduler = ON;
開啓事務的目的:是爲了確保數據的準確性,如果需要同時執行多條SQL語句,則需要放到事務中進行,只要其中有一行執行失敗,則事務回滾。如果只是查詢操作,不牽扯對數據庫內容的更改,不需要開啓事務。但是,在Hibernate中個人建議最好也把查詢都放在事務中進行,增刪改則必須要放到事務進行。
1、事務的特性:原子性、一致性、隔離性、持久性
2、多事務同時執行的時候,可能會出現的問題:髒讀、不可重複讀、幻讀
3、事務隔離級別:
讀未提交(Read uncommitted)
別人改數據的事務尚未提交,我在我的事務中也能讀到。
讀提交(Read committed)
別人改數據的事務已經提交,我在我的事務中才能讀到。
可重複讀(Repeatable read)
別人改數據的事務已經提交,我在我的事務中也不去讀
串行化(Serializable 序列化)
我的事務尚未提交,別人就別想改數據。
這4種隔離級別,並行性能依次降低,安全性依次提高
選擇數據庫,查看當前事務隔離界別
select @@tx_isolation;
設置MySQL事務的隔離級別:
/設置mysql的隔離級別: set session transaction isolation level 設置事務隔離級別
//設置read uncommitted級別:(讀未提交)
set session transaction isolation level read uncommitted;
//設置read committed級別:(讀提交)
set session transaction isolation level read committed;
//設置repeatable read級別:(可重複讀)
set session transaction isolation level repeatable read;
//設置serializable級別:(串行化)
set session transaction isolation level serializable;
隔離級別對應會出現髒讀、不可重複讀、幻讀的情況
4、
髒讀:
當數據庫中一個事務A正在修改一個數據但是還未提交或者回滾,
另一個事務B 來讀取了修改後的內容並且使用了,
之後事務A提交了,此時就引起了髒讀。
此情況僅會發生在: 讀未提交的的隔離級別.
不可重複讀:
在一個事務A中多次操作數據,在事務操作過程中(未最終提交),
事務B也才做了處理,並且該值發生了改變,這時候就會導致A在事務操作
的時候,發現數據與第一次不一樣了。 就是不可重複讀。
此情況僅會發生在:讀未提交、讀提交的隔離級別.
幻讀:
一個事務按相同的查詢條件重新讀取以前檢索過的數據,
卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱爲幻讀。
幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,比如這種修改涉及到表中的“全部數據行”。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入“一行新數據”。那麼,以後就會發生操作第一個事務的用戶發現表中還存在沒有修改的數據行,就好象發生了幻覺一樣.
一般解決幻讀的方法是增加範圍鎖RangeS,鎖定檢索範圍爲只讀,這樣就避免了幻讀。