vba可以做網(wǎng)站自動(dòng)填海外廣告投放公司
一、本地事務(wù)
1、事務(wù)的基本特性
? ? ? ? 數(shù)據(jù)庫(kù)事務(wù)的幾個(gè)基本特性:原子性、一致性、隔離性、持久性。
????????? 原子性:一系列的操作整體不可拆分,要么同時(shí)成功,要么同時(shí)失敗。
????????? 一致性:數(shù)據(jù)在事務(wù)的前后,業(yè)務(wù)整體一致。
?????????????????轉(zhuǎn)賬。A:1000;B:1000; 轉(zhuǎn) 200 ; 事務(wù)成功:A:800? B:1200
????????? 隔離性:事務(wù)之間互相隔離。????????
????????????????隔離級(jí)別的一個(gè)核心問(wèn)題是:一個(gè)事務(wù)的執(zhí)行過(guò)程和結(jié)果是否會(huì)影響到其他正在執(zhí)行的事務(wù)。可串行化是最高級(jí)別的隔離,即事務(wù)之間互不影響。(多個(gè)并行的事務(wù)的結(jié)果與一個(gè)一個(gè)串行執(zhí)行的結(jié)果一樣)
????????? 持久性:一旦事務(wù)成功,數(shù)據(jù)一定會(huì)落盤(pán)在數(shù)據(jù)庫(kù)。
2、事務(wù)的隔離級(jí)別
讀未提交
????????該隔離級(jí)別的事務(wù)會(huì)讀到其它未提交事務(wù)的數(shù)據(jù),此現(xiàn)象也稱(chēng)之為臟讀。
? ? ? ? 事務(wù)1對(duì)A進(jìn)行修改還未提交,事務(wù)2讀取的是所謂的臟數(shù)據(jù)
????????
????????丟失更新
????????
讀已提交?
????????一個(gè)事務(wù)可以讀取另一個(gè)已提交的事務(wù),多次讀取會(huì)造成不一樣的結(jié)果,此現(xiàn)象稱(chēng)為不可重 復(fù)讀問(wèn)題,Oracle 和 SQL Server 的默認(rèn)隔離級(jí)別。
? ? ? ? 不可重復(fù)讀是指一個(gè)事務(wù)在整個(gè)事務(wù)過(guò)程中對(duì)同一筆數(shù)據(jù)進(jìn)行讀取的到的結(jié)果不同。出現(xiàn)的原因就是事務(wù)的并發(fā)修改記錄。
????????
可重復(fù)讀
????????該隔離級(jí)別是 MySQL 默認(rèn)的隔離級(jí)別,在同一個(gè)事務(wù)里,select 的結(jié)果是事務(wù)開(kāi)始時(shí)時(shí)間 點(diǎn)的狀態(tài),因此,同樣的 select 操作讀到的結(jié)果會(huì)是一致的,但是,會(huì)有幻讀現(xiàn)象。MySQL 的 InnoDB 引擎可以通過(guò) next-key locks 機(jī)制來(lái)避免幻讀。
? ? ? ? 幻讀是同一個(gè)事務(wù)的同一個(gè)查詢(xún)的多次返回結(jié)果記錄數(shù)量不一致。
????????
序列化
????????在該隔離級(jí)別下事務(wù)都是串行順序執(zhí)行的,MySQL 數(shù)據(jù)庫(kù)的 InnoDB 引擎會(huì)給讀操作隱式加一把讀共享鎖,從而避免了臟讀、不可重復(fù)讀和幻讀問(wèn)題。
3、Java事務(wù)控制
編程式事務(wù)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class JdbcTransactionExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String user = "username";String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password)) {// 關(guān)閉自動(dòng)提交,開(kāi)啟事務(wù)conn.setAutoCommit(false);try (Statement stmt = conn.createStatement()) {// 執(zhí)行一些SQL操作stmt.executeUpdate("INSERT INTO table1 (column1) VALUES ('value1')");stmt.executeUpdate("UPDATE table2 SET column2 = 'value2' WHERE id = 1");// 提交事務(wù)conn.commit();} catch (SQLException e) {// 回滾事務(wù)conn.rollback();e.printStackTrace();}} catch (SQLException e) {e.printStackTrace();}}
}
聲明式事務(wù)
????????基于Spring AOP,通過(guò)注解或XML配置實(shí)現(xiàn);有助于用戶(hù)將操作與事務(wù)規(guī)則進(jìn)行解耦。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class MyService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void performTransaction() {jdbcTemplate.update("INSERT INTO table1 (column1) VALUES ('value1')");jdbcTemplate.update("UPDATE table2 SET column2 = 'value2' WHERE id = 1");}
}
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" propagation="REQUIRED" /></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
?
二、分布式事務(wù)
????????分布式系統(tǒng)經(jīng)常出現(xiàn)的異常機(jī)器宕機(jī)、網(wǎng)絡(luò)異常、消息丟失、消息亂序、數(shù)據(jù)錯(cuò)誤、不可靠的 TCP、存儲(chǔ)數(shù)據(jù)丟失。分布式事務(wù)是企業(yè)集成中的一個(gè)技術(shù)難點(diǎn),也是每一個(gè)分布式系統(tǒng)架構(gòu)中都會(huì)涉及到的一個(gè) 東西,特別是在微服務(wù)架構(gòu)中,幾乎可以說(shuō)是無(wú)法避免。
1、CAP 定理與 BASE理論
1.1、CAP定理
????????CAP 原則又稱(chēng) CAP 定理,指的是在一個(gè)分布式系統(tǒng)中:
????????? 一致性(Consistency):
????????????????在分布式系統(tǒng)中的所有數(shù)據(jù)備份,在同一時(shí)刻是否是同樣的值。(等同于所有節(jié)點(diǎn)訪問(wèn)同一份最新的數(shù)據(jù)副本)。
????????? 可用性(Availability)
? ? ? ? ? ? ? ? 在集群中一部分節(jié)點(diǎn)故障后,集群整體是否還能響應(yīng)客戶(hù)端的讀寫(xiě)請(qǐng)求。(對(duì)數(shù)據(jù)更新具備高可用性)
????????? 分區(qū)容錯(cuò)性(Partition tolerance)
????????????????大多數(shù)分布式系統(tǒng)都分布在多個(gè)子網(wǎng)絡(luò)。每個(gè)子網(wǎng)絡(luò)就叫做一個(gè)區(qū)(partition)。 分區(qū)容錯(cuò)的意思是,區(qū)間通信可能失敗。比如,一臺(tái)服務(wù)器放在中國(guó),另一臺(tái)服務(wù) 器放在美國(guó),這就是兩個(gè)區(qū),它們之間可能無(wú)法通信。
CAP 原則指的是,這三個(gè)要素最多只能同時(shí)實(shí)現(xiàn)兩點(diǎn),不可能三者兼顧。
分布式事務(wù)raft算法
?
1.2、BASE 理論
????????是對(duì) CAP 理論的延伸,思想是即使無(wú)法做到強(qiáng)一致性(CAP 的一致性就是強(qiáng)一致性),但可以采用適當(dāng)?shù)牟扇∪跻恢滦?#xff0c;即最終一致性。
????????BASE 是指
????????????????? 基本可用(Basically Available)
????????????????????????基本可用是指分布式系統(tǒng)在出現(xiàn)故障的時(shí)候,允許損失部分可用性(例如響應(yīng)時(shí)間、 功能上的可用性),允許損失部分可用性。需要注意的是,基本可用不等價(jià)于系統(tǒng)不可用。
????????????????????????響應(yīng)時(shí)間上的損失:正常情況下搜索引擎需要在 0.5 秒之內(nèi)返回給用戶(hù)相應(yīng)的查詢(xún)結(jié)果,但由于出現(xiàn)故障(比如系統(tǒng)部分機(jī)房發(fā)生斷電或斷網(wǎng)故障),查詢(xún)結(jié)果的響應(yīng)時(shí)間增加到了 1~2 秒。
????????????????????????功能上的損失:購(gòu)物網(wǎng)站在購(gòu)物高峰(如雙十一)時(shí),為了保護(hù)系統(tǒng)的穩(wěn)定性, 部分消費(fèi)者可能會(huì)被引導(dǎo)到一個(gè)降級(jí)頁(yè)面。
???????????????? ? 軟狀態(tài)( Soft State)
????????????????????????軟狀態(tài)是指允許系統(tǒng)存在中間狀態(tài),而該中間狀態(tài)不會(huì)影響系統(tǒng)整體可用性。分布 式存儲(chǔ)中一般一份數(shù)據(jù)會(huì)有多個(gè)副本,允許不同副本同步的延時(shí)就是軟狀態(tài)的體現(xiàn)。mysql replication 的異步復(fù)制也是一種體現(xiàn)。
? ? ? ? ? ? ? ? ?最終一致性( Eventual Consistency)
????????????????????????最終一致性是指系統(tǒng)中的所有數(shù)據(jù)副本經(jīng)過(guò)一定時(shí)間后,最終能夠達(dá)到一致的狀 態(tài)。弱一致性和強(qiáng)一致性相反,最終一致性是弱一致性的一種特殊情況。
1.3、強(qiáng)一致性、弱一致性、最終一致性
????????從客戶(hù)端角度,多進(jìn)程并發(fā)訪問(wèn)時(shí),更新過(guò)的數(shù)據(jù)在不同進(jìn)程如何獲取的不同策略,決定了 不同的一致性。對(duì)于關(guān)系型數(shù)據(jù)庫(kù),要求更新過(guò)的數(shù)據(jù)能被后續(xù)的訪問(wèn)都能看到,這是強(qiáng)一致性。如果能容忍后續(xù)的部分或者全部訪問(wèn)不到,則是弱一致性。如果經(jīng)過(guò)一段時(shí)間后要求能訪問(wèn)到更新后的數(shù)據(jù),則是最終一致性。
三、分布式事務(wù)的幾種方案
1、2PC模式
????????第一階段:事務(wù)協(xié)調(diào)器要求每個(gè)涉及到事務(wù)的數(shù)據(jù)庫(kù)預(yù)提交(precommit)此操作,并反映是 否可以提交。
????????第二階段:事務(wù)協(xié)調(diào)器要求每個(gè)數(shù)據(jù)庫(kù)提交數(shù)據(jù)。 其中,如果有任何一個(gè)數(shù)據(jù)庫(kù)否決此次提交,那么所有數(shù)據(jù)庫(kù)都會(huì)被要求回滾它們?cè)诖耸聞?wù)中的那部分信息。
2、柔性事務(wù)-TCC 事務(wù)補(bǔ)償型方案
剛性事務(wù):遵循 ACID 原則,強(qiáng)一致性。
柔性事務(wù):遵循 BASE 理論,最終一致性; 與剛性事務(wù)不同,柔性事務(wù)允許一定時(shí)間內(nèi),不同節(jié)點(diǎn)的數(shù)據(jù)不一致,但要求最終一致。
一階段 prepare 行為:調(diào)用 自定義 的 prepare 邏輯。
二階段 commit 行為:調(diào)用 自定義 的 commit 邏輯。
二階段 rollback 行為:調(diào)用 自定義 的 rollback 邏輯。
所謂 TCC 模式,是指支持把 自定義 的分支事務(wù)納入到全局事務(wù)的管理中。
3、柔性事務(wù)-最大努力通知型方案
????????按規(guī)律進(jìn)行通知,不保證數(shù)據(jù)一定能通知成功,但會(huì)提供可查詢(xún)操作接口進(jìn)行核對(duì)。這種 方案主要用在與第三方系統(tǒng)通訊時(shí),比如:調(diào)用微信或支付寶支付后的支付結(jié)果通知。這種方案也是結(jié)合 MQ 進(jìn)行實(shí)現(xiàn),例如:通過(guò) MQ 發(fā)送 http 請(qǐng)求,設(shè)置最大通知次數(shù)。達(dá)到通知次數(shù)后即不再通知。