一:事務(wù)的4個(gè)限定屬性(ACID)
1形帮、原子性(Atomic) :對(duì)數(shù)據(jù)的修改要么全部執(zhí)行槽惫,要么全部不執(zhí)行。
2辩撑、一致性(Consistent) :在事務(wù)執(zhí)行前后界斜,數(shù)據(jù)狀態(tài)保持一致性。
3合冀、隔離性(Isolated) :一個(gè)事務(wù)的處理不能影響另一個(gè)事務(wù)的處理各薇。
4、持續(xù)性(Durable) :事務(wù)處理結(jié)束君躺,其效果在數(shù)據(jù)庫(kù)中持久化峭判。
二:隔離性(Isolated)細(xì)分4個(gè)隔離級(jí)別:
1、讀未提交(read uncommitted):一個(gè)事務(wù)可以讀取另一個(gè)事2務(wù)沒(méi)有提交的數(shù)據(jù)晰洒。存在臟讀朝抖、不可重復(fù)讀、幻讀的問(wèn)題谍珊。
2治宣、讀提交(Read Committed):一個(gè)事務(wù)的操作結(jié)果只有在該事務(wù)提交之后急侥,另一個(gè)事務(wù)才能讀取到。避免另臟讀侮邀,存在不可重復(fù)讀坏怪、幻讀的問(wèn)題。
3绊茧、可重復(fù)讀(Repeatable Read):保證在一個(gè)事務(wù)中铝宵,對(duì)同一筆數(shù)據(jù)的讀取結(jié)果是相同的。避免另臟讀华畏、不可重復(fù)讀鹏秋,存在幻讀的問(wèn)題。
4亡笑、序列化讀(Serializable):所以的事務(wù)是按順序執(zhí)行的侣夷。
臟讀、不可重復(fù)讀仑乌、幻讀:
臟讀:一個(gè)事務(wù)讀取了百拓,另一個(gè)事務(wù)為提交的數(shù)據(jù)
不可重復(fù)讀:一個(gè)事務(wù)內(nèi)對(duì)同一筆數(shù)據(jù)的多次讀取結(jié)果不同,不可重復(fù)讀的重點(diǎn)是修改晰甚。
幻讀:同樣一筆查詢?cè)谡麄€(gè)事務(wù)過(guò)程中多次執(zhí)行后衙传,查詢所得的結(jié)果集是不一樣的〔蘧牛幻讀針對(duì)的是多筆記錄蓖捶。幻讀的重點(diǎn)在于新增或者刪除 (數(shù)據(jù)條數(shù)變化)
三止剖、Spring事務(wù)的主要接口:
PlatformTransactionManager:界定事務(wù)的邊界
public interface PlatformTransactionManager {
//獲取事務(wù)
TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
//提交
void commit(TransactionStatus var1) throws TransactionException;
//回滾
void rollback(TransactionStatus var1) throws TransactionException;
}
TransactionDefinition:負(fù)責(zé)定義事務(wù)的相關(guān)屬性
public interface TransactionDefinition {
//獲取事務(wù)傳播類型
int getPropagationBehavior();
//獲取事務(wù)隔離級(jí)別
int getIsolationLevel();
//獲取事務(wù)超時(shí)時(shí)間
int getTimeout();
//事務(wù)的只讀性
boolean isReadOnly();
//獲取事務(wù)名稱
String getName();
}
TransactionStatus:事務(wù)開(kāi)啟之后后事務(wù)結(jié)束期間的事務(wù)狀態(tài)
public interface TransactionStatus extends SavepointManager, Flushable {
// 是否是新的事物
boolean isNewTransaction();
// 是否有恢復(fù)點(diǎn)
boolean hasSavepoint();
//標(biāo)記回滾當(dāng)前事務(wù)
void setRollbackOnly();
//判斷當(dāng)前事務(wù)是不是標(biāo)記為回滾
boolean isRollbackOnly();
//刷新會(huì)話到數(shù)據(jù)庫(kù)
void flush();
// 是否已完成
boolean isCompleted();
}
四:事務(wù)屬性:
事務(wù)的傳播屬性:
1腺阳、TransactionDefinition.PROPAGATION_REQUIRED: 如果當(dāng)前存在事務(wù),則加入該事務(wù)穿香;如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)绎速。
2皮获、TransactionDefinition.PROPAGATION_SUPPORTS: 如果當(dāng)前存在事務(wù),則加入該事務(wù)纹冤;如果當(dāng)前沒(méi)有事務(wù)洒宝,則以非事務(wù)的方式繼續(xù)運(yùn)行。
3萌京、TransactionDefinition.PROPAGATION_MANDATORY: 如果當(dāng)前存在事務(wù)雁歌,則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù)知残,則拋出異常靠瞎。
不支持當(dāng)前事務(wù)的情況:
4、TransactionDefinition.PROPAGATION_REQUIRES_NEW: 創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù)乏盐,則把當(dāng)前事務(wù)掛起佳窑。
5、TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務(wù)方式運(yùn)行父能,如果當(dāng)前存在事務(wù)神凑,則把當(dāng)前事務(wù)掛起。
6何吝、TransactionDefinition.PROPAGATION_NEVER: 以非事務(wù)方式運(yùn)行溉委,如果當(dāng)前存在事務(wù),則拋出異常爱榕。
其他情況:
7薛躬、TransactionDefinition.PROPAGATION_NESTED: 如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行呆细;如果當(dāng)前沒(méi)有事務(wù)型宝,則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED。
事務(wù)的隔離屬性:
1絮爷、TransactionDefinition.ISOLATION_DEFAULT: 使用后端數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別趴酣,Mysql 默認(rèn)采用的 REPEATABLE_READ隔離級(jí)別 Oracle 默認(rèn)采用的 READ_COMMITTED隔離級(jí)別.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更坑夯,可能會(huì)導(dǎo)致臟讀岖寞、幻讀或不可重復(fù)讀
2、TransactionDefinition.ISOLATION_READ_COMMITTED: 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù)柜蜈,可以阻止臟讀仗谆,但是幻讀或不可重復(fù)讀仍有可能發(fā)生
3、TransactionDefinition.ISOLATION_REPEATABLE_READ: 對(duì)同一字段的多次讀取結(jié)果都是一致的淑履,除非數(shù)據(jù)是被本身事務(wù)自己所修改隶垮,可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生秘噪。
4狸吞、TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別指煎。所有的事務(wù)依次逐個(gè)執(zhí)行蹋偏,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說(shuō)至壤,該級(jí)別可以防止臟讀威始、不可重復(fù)讀以及幻讀。但是這將嚴(yán)重影響程序的性能像街。通常情況下也不會(huì)用到該級(jí)別黎棠。
事務(wù)超時(shí)屬性(一個(gè)事務(wù)允許執(zhí)行的最長(zhǎng)時(shí)間)
所謂事務(wù)超時(shí)晋渺,就是指一個(gè)事務(wù)所允許執(zhí)行的最長(zhǎng)時(shí)間,如果超過(guò)該時(shí)間限制但事務(wù)還沒(méi)有完成葫掉,則自動(dòng)回滾事務(wù)些举。在 TransactionDefinition 中以 int 的值來(lái)表示超時(shí)時(shí)間,其單位是秒俭厚。
事務(wù)只讀屬性(對(duì)事物資源是否執(zhí)行只讀操作)
事務(wù)的只讀屬性是指户魏,對(duì)事務(wù)性資源進(jìn)行只讀操作或者是讀寫(xiě)操作。所謂事務(wù)性資源就是指那些被事務(wù)管理的資源挪挤,比如數(shù)據(jù)源叼丑、 JMS 資源,以及自定義的事務(wù)性資源等等扛门。如果確定只對(duì)事務(wù)性資源進(jìn)行只讀操作鸠信,那么我們可以將事務(wù)標(biāo)志為只讀的,以提高事務(wù)處理的性能论寨。在 TransactionDefinition 中以 boolean 類型來(lái)表示該事務(wù)是否只讀星立。