原子性、一致性、隔離性、永續性
隔離性:多個使用者併發訪問資料庫時,乙個使用者的事務不可以被其他使用者的事務所干擾,多個併發事務之間,資料要相互隔離。
如果不考慮事務的隔離性將會導致:髒讀、不可重複讀、幻讀
髒讀:乙個事務讀取了另乙個事務改寫但還未提交的資料,如果這些資料被回滾,則讀到的資料是無效的。
不可重複讀:在同一事務中,多次讀取同一資料返回的結果有所不同。
幻讀:乙個事務讀取了幾行記錄後,另乙個事務插入一些記錄,幻讀就發生了,在後來的查詢中,第乙個事務就會發生有些原來沒有的記錄。
default:使用後端資料庫預設的隔離級別(spring)中的預設選擇
@target()
@retention(retentionpolicy.runtime)
@inherited
@documented
public @inte***ce
transactional ;
string rollbackforclassname() default {};
class
<? extends
throwable> norollbackfor() default {};
string norollbackforclassname() default {};
}
read_uncommited:允許你讀取還未提交的改變了的資料,可導致髒讀、幻讀、不可重複讀
read_commited:允許在併發事務已經提交後讀取,可防止髒讀但幻讀和不可重複讀仍可發生。
repeatable_read:對相同欄位的多次讀取是一致的,除非資料被事務本身改變。可防止髒讀、不可重複讀但幻讀仍可能發生, 該事務的隔離級別也是mysql預設的事務隔離級別。
serializtable:完全服從acid的隔離級別,確保不發生髒讀、幻讀、不可重複讀。這是所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的資料表完成。
1.對於我們公司常用的mysql innodb的資料引擎,它所執行的是行級鎖。所以我們要減少更新、修改、刪除操作,對一條資料的鎖定時間。如果乙個事務長期占有一條資料,那麼其他執行緒事務操作該資料時就會等待。
2.在springboot專案程式設計中,如果要對乙個service進行事務管理,需要在該service的實現類的重寫方法上新增事務註解指定rollbackfor = 因為spring預設的事務只回滾執行異常。
@transactional(rollbackfor = )
//並且在需要回滾的地方加上
transactionaspectsupport.currenttransactionstatus().setrollbackonly();
mysql 筆記 事務
一 問題讀取 1.髒讀 dirty read 事務1更新了某一條記錄,但未提交 事務2讀取到新的未提交記錄 事務1回滾。2.不可重複讀取 nonrepeatable read 不可重複讀,是指在資料庫訪問中,乙個 事務範圍內兩個相同的查詢卻返回了不同資料。例子 事務1讀取某一條記錄 事務2修改事務1...
mysql筆記 事務
寫日誌為什麼比直接寫磁碟要快?使用事務日誌,儲存引擎在修改表的資料時,只需要修改其記憶體拷貝,再把該修改行為記錄到硬碟上的事務日誌中,而不用每次都將修改的資料本身持久到磁碟。事務日誌採用的是追加的方式,因此寫日誌的操作是磁碟上一小塊區域內的順序i o,而不是隨機i o,所以快很多。事務日誌持久以後,...
Mysql筆記 事務
事務 transaction 會把資料庫從一種一致狀態轉換為另一種一致狀態。在資料庫提交工作時,要麼所有修改都已經儲存了,要麼修改都不儲存。事務是訪問並更新資料庫中各種資料項的乙個程式執行單元。在執行中要麼都做修改,要麼都不做修改。innodb儲存引擎中的事務完全符合acid的特性。l 原子性 at...