一:事務的4個限定屬性(ACID)
1、原子性(Atomic) :對數據的修改要么全部執(zhí)行,要么全部不執(zhí)行。
2、一致性(Consistent) :在事務執(zhí)行前后,數據狀態(tài)保持一致性。
3、隔離性(Isolated) :一個事務的處理不能影響另一個事務的處理。
4、持續(xù)性(Durable) :事務處理結束,其效果在數據庫中持久化。
二:隔離性(Isolated)細分4個隔離級別:
1、讀未提交(read uncommitted):一個事務可以讀取另一個事2務沒有提交的數據。存在臟讀、不可重復讀、幻讀的問題。
2、讀提交(Read Committed):一個事務的操作結果只有在該事務提交之后,另一個事務才能讀取到。避免另臟讀,存在不可重復讀、幻讀的問題。
3、可重復讀(Repeatable Read):保證在一個事務中,對同一筆數據的讀取結果是相同的。避免另臟讀、不可重復讀,存在幻讀的問題。
4、序列化讀(Serializable):所以的事務是按順序執(zhí)行的。
臟讀、不可重復讀、幻讀:
臟讀:一個事務讀取了,另一個事務為提交的數據
不可重復讀:一個事務內對同一筆數據的多次讀取結果不同,不可重復讀的重點是修改。
幻讀:同樣一筆查詢在整個事務過程中多次執(zhí)行后,查詢所得的結果集是不一樣的?;米x針對的是多筆記錄。幻讀的重點在于新增或者刪除 (數據條數變化)
三、Spring事務的主要接口:
PlatformTransactionManager:界定事務的邊界
public interface PlatformTransactionManager {
//獲取事務
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
//提交
void commit(TransactionStatus var1) throws TransactionException;
//回滾
void rollback(TransactionStatus var1) throws TransactionException;
}
TransactionDefinition:負責定義事務的相關屬性
public interface TransactionDefinition {
//獲取事務傳播類型
int getPropagationBehavior();
//獲取事務隔離級別
int getIsolationLevel();
//獲取事務超時時間
int getTimeout();
//事務的只讀性
boolean isReadOnly();
//獲取事務名稱
String getName();
}
TransactionStatus:事務開啟之后后事務結束期間的事務狀態(tài)
public interface TransactionStatus extends SavepointManager, Flushable {
// 是否是新的事物
boolean isNewTransaction();
// 是否有恢復點
boolean hasSavepoint();
//標記回滾當前事務
void setRollbackOnly();
//判斷當前事務是不是標記為回滾
boolean isRollbackOnly();
//刷新會話到數據庫
void flush();
// 是否已完成
boolean isCompleted();
}
四:事務屬性:
事務的傳播屬性:
1、TransactionDefinition.PROPAGATION_REQUIRED: 如果當前存在事務,則加入該事務;如果當前沒有事務,則創(chuàng)建一個新的事務。
2、TransactionDefinition.PROPAGATION_SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。
3、TransactionDefinition.PROPAGATION_MANDATORY: 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
不支持當前事務的情況:
4、TransactionDefinition.PROPAGATION_REQUIRES_NEW: 創(chuàng)建一個新的事務,如果當前存在事務,則把當前事務掛起。
5、TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務方式運行,如果當前存在事務,則把當前事務掛起。
6、TransactionDefinition.PROPAGATION_NEVER: 以非事務方式運行,如果當前存在事務,則拋出異常。
其他情況:
7、TransactionDefinition.PROPAGATION_NESTED: 如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。
事務的隔離屬性:
1、TransactionDefinition.ISOLATION_DEFAULT: 使用后端數據庫默認的隔離級別,Mysql 默認采用的 REPEATABLE_READ隔離級別 Oracle 默認采用的 READ_COMMITTED隔離級別.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀
2、TransactionDefinition.ISOLATION_READ_COMMITTED: 允許讀取并發(fā)事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發(fā)生
3、TransactionDefinition.ISOLATION_REPEATABLE_READ: 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發(fā)生。
4、TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執(zhí)行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
事務超時屬性(一個事務允許執(zhí)行的最長時間)
所謂事務超時,就是指一個事務所允許執(zhí)行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。
事務只讀屬性(對事物資源是否執(zhí)行只讀操作)
事務的只讀屬性是指,對事務性資源進行只讀操作或者是讀寫操作。所謂事務性資源就是指那些被事務管理的資源,比如數據源、 JMS 資源,以及自定義的事務性資源等等。如果確定只對事務性資源進行只讀操作,那么我們可以將事務標志為只讀的,以提高事務處理的性能。在 TransactionDefinition 中以 boolean 類型來表示該事務是否只讀。