貴溪市城鄉(xiāng)建設(shè)局網(wǎng)站推廣公眾號(hào)的9種方法
1、事務(wù)的基本性質(zhì)
數(shù)據(jù)庫事務(wù)的幾個(gè)特性:原子性(Atomicity )、一致性( Consistency )、隔離性或獨(dú)立性( Isolation) 和持久性(Durabilily),簡稱就是 ACID;
? 原子性:一系列的操作整體不可拆分,要么同時(shí)成功,要么同時(shí)失敗
? 一致性:數(shù)據(jù)在事務(wù)的前后,業(yè)務(wù)整體一致。
? 轉(zhuǎn)賬。A:1000;B:1000; 轉(zhuǎn) 200 事務(wù)成功; A:800 B:1200
? 隔離性:事務(wù)之間互相隔離。
? 持久性:一旦事務(wù)成功,數(shù)據(jù)一定會(huì)落盤在數(shù)據(jù)庫。
在以往的單體應(yīng)用中,我們多個(gè)業(yè)務(wù)操作使用同一條連接操作不同的數(shù)據(jù)表,一旦有異常, 我們可以很容易的整體回滾;
Business:我們具體的業(yè)務(wù)代碼
Storage:庫存業(yè)務(wù)代碼;扣庫存
Order:訂單業(yè)務(wù)代碼;保存訂單
Account:賬號(hào)業(yè)務(wù)代碼;減賬戶余額
比如買東西業(yè)務(wù),扣庫存,下訂單,賬戶扣款,是一個(gè)整體;必須同時(shí)成功或者失敗
一個(gè)事務(wù)開始,代表以下的所有操作都在同一個(gè)連接里面;
2、事務(wù)的隔離級別
? READ UNCOMMITTED(讀未提交) 該隔離級別的事務(wù)會(huì)讀到其它未提交事務(wù)的數(shù)據(jù),此現(xiàn)象也稱之為臟讀。
? READ COMMITTED(讀提交) 一個(gè)事務(wù)可以讀取另一個(gè)已提交的事務(wù),多次讀取會(huì)造成不一樣的結(jié)果,此現(xiàn)象稱為不可重 復(fù)讀問題,Oracle 和 SQL Server 的默認(rèn)隔離級別。
? REPEATABLE READ(可重復(fù)讀) 該隔離級別是 MySQL 默認(rèn)的隔離級別,在同一個(gè)事務(wù)里,select 的結(jié)果是事務(wù)開始時(shí)時(shí)間 點(diǎn)的狀態(tài),因此,同樣的 select 操作讀到的結(jié)果會(huì)是一致的,但是,會(huì)有幻讀現(xiàn)象。MySQL 的 InnoDB 引擎可以通過 next-key locks 機(jī)制(參考下文"行鎖的算法"一節(jié))來避免幻讀。
? SERIALIZABLE(序列化) 在該隔離級別下事務(wù)都是串行順序執(zhí)行的,MySQL 數(shù)據(jù)庫的 InnoDB 引擎會(huì)給讀操作隱式 加一把讀共享鎖,從而避免了臟讀、不可重讀復(fù)讀和幻讀問題。
3、事務(wù)的傳播行為
1、PROPAGATION_REQUIRED:如果當(dāng)前沒有事務(wù),就創(chuàng)建一個(gè)新事務(wù),如果當(dāng)前存在事務(wù), 就加入該事務(wù),該設(shè)置是最常用的設(shè)置。
2、PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),如果當(dāng) 前不存在事務(wù),就以非事務(wù)執(zhí)行。
3、PROPAGATION_MANDATORY:支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),如果 當(dāng)前不存在事務(wù),就拋出異常。
4、PROPAGATION_REQUIRES_NEW:創(chuàng)建新事務(wù),無論當(dāng)前存不存在事務(wù),都創(chuàng)建新事務(wù)。 5、PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng) 前事務(wù)掛起。
6、PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
7、PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù), 則執(zhí)行與 PROPAGATION_REQUIRED 類似的操作。
4、SpringBoot 事務(wù)關(guān)鍵點(diǎn)
1、事務(wù)的自動(dòng)配置 TransactionAutoConfiguration
2、事務(wù)的坑 在同一個(gè)類里面,編寫兩個(gè)方法,內(nèi)部調(diào)用的時(shí)候,會(huì)導(dǎo)致事務(wù)設(shè)置失效。原因是沒有用到 代理對象的緣故。
解決:
0)、導(dǎo)入 spring-boot-starter-aop
1)、@EnableTransactionManagement(proxyTargetClass = true)
2)、@EnableAspectJAutoProxy(exposeProxy=true)
3)、AopContext.currentProxy() 調(diào)用方法