偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

MySQL和MongoDB事務(wù)同步的一種嘗試

數(shù)據(jù)庫 MySQL
對于要求更高事務(wù)一致性的場景,可能需要考慮使用專門的分布式事務(wù)解決方案,如 XA 協(xié)議或 TCC (Try-Confirm-Cancel) 模式。 比如JTA就屬于XA協(xié)議, 我們可以使用開源實(shí)現(xiàn)atomikos。

現(xiàn)象

最近線上的一條數(shù)據(jù)狀態(tài)不對,但是日志又記錄上了。 查看了這條數(shù)據(jù)的更新邏輯

public Boolean autoReject(AutoRejectParam param) {
        
        OperationLog log = createOperationLog(param);

        // 保存操作日志到mysql
        operationLogMapper.insertSelective(log);

        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.and("requestId").is(param.getRequestId());
        query.addCriteria(criteria);
        Update update = new Update();
        update.set("status", CvBusinessStatusEnum.Rejected.getCode())
                .set("updateTime", new Date())
                .set("taskId", "");
        mongoTemplate.updateFirst(query, update, JSONObject.class, collectionName);

        return true;
    }

從代碼可以看出這里分別保存了日志到mysql,然后更新了mongodb中的數(shù)據(jù)狀態(tài)。

很明顯保存mysql成功了,但是更新mongodb的數(shù)據(jù)失敗了,那為什么保存mongodb的數(shù)據(jù)失敗了呢? 然后根據(jù)日志發(fā)現(xiàn),當(dāng)時服務(wù)器和mongodb連接出現(xiàn)了問題,于是就導(dǎo)致了保存mysql成功,保存到mongodb失敗了。

如何解決?

問題既然產(chǎn)生了,那么有什么辦法能夠保證要成功就都成功呢? 第一個想到的是事務(wù),我們需要保證兩個數(shù)據(jù)庫操作的事務(wù)一致性就可以避免這個問題了。使用單一的事務(wù)管理器肯定是不行的,需要使用鏈?zhǔn)绞聞?wù)。

我們可以使用spring中的ChainedTransactionManager來實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

@Configuration
public class TransactionConfig {

    @Bean
    public PlatformTransactionManager mongoTransactionManager(MongoTemplate mongoTemplate) {
        return new MongoTransactionManager(mongoTemplate.getMongoDbFactory());
    }

    @Bean
    public PlatformTransactionManager jpaTransactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public ChainedTransactionManager chainedTransactionManager(
            PlatformTransactionManager mongoTransactionManager,
            PlatformTransactionManager jpaTransactionManager) {
        return new ChainedTransactionManager(mongoTransactionManager, jpaTransactionManager);
    }
}


@Transactional("chainedTransactionManager")
public Boolean autoReject(AutoRejectParam param) {
        
        //省略其他代碼 

        // 保存操作日志到mysql
   operationLogMapper.insertSelective(log);

   // 更新mongodb
        mongoTemplate.updateFirst(query, update, JSONObject.class, collectionName);

        return true;
  }

這種方法使用 ChainedTransactionManager 來管理多個事務(wù)管理器。當(dāng)方法執(zhí)行時,它會按順序開啟所有事務(wù),如果在執(zhí)行過程中出現(xiàn)異常,它會按相反的順序回滾所有事務(wù)。

需要注意的是,這種方法并不能保證 100% 的事務(wù)一致性,因?yàn)樗鼘?shí)際上是在應(yīng)用層面模擬的分布式事務(wù)。在某些極端情況下(比如網(wǎng)絡(luò)故障或服務(wù)器崩潰),可能會出現(xiàn)部分提交的情況。

比如我們是現(xiàn)在這樣的執(zhí)行流程

transaction1 begin
  transaction2 begin
  transaction2 commit -> error rollbacks, rollbacks transction1 too
transaction1 commit -> error, only rollbacks transaction1

比如上面這種情況,在最后提交transaction1的時候如果由于網(wǎng)絡(luò)原因提交失敗了,就會導(dǎo)致事務(wù)2成功,事務(wù)1失敗,還是部分提交了。

當(dāng)然如果業(yè)務(wù)要求對于這種不一致是可以接受的,或者說我們可以進(jìn)行手動補(bǔ)償方式達(dá)到最終一致性,那這種方案也是可以接受的。

對于要求更高事務(wù)一致性的場景,可能需要考慮使用專門的分布式事務(wù)解決方案,如 XA 協(xié)議或 TCC (Try-Confirm-Cancel) 模式。 比如JTA就屬于XA協(xié)議, 我們可以使用開源實(shí)現(xiàn)atomikos。

責(zé)任編輯:武曉燕 來源: think123
相關(guān)推薦

2011-03-01 09:43:13

MapReduce架構(gòu)

2014-09-17 14:37:06

2013-05-27 15:50:32

NETGEAR無線路由

2020-12-09 10:15:34

Pythonweb代碼

2020-12-23 10:10:23

Pythonweb代碼

2022-07-07 10:33:27

Python姿勢代碼

2022-06-22 09:44:41

Python文件代碼

2015-12-18 16:15:55

架構(gòu)新型計(jì)算模型

2017-01-22 16:35:02

iOSBlockCallback

2012-01-17 11:02:39

2017-02-20 09:00:49

2015-01-21 15:35:58

開源

2015-08-03 09:36:01

賽迪翻譯

2015-08-31 09:27:21

語言界面UI

2023-06-02 15:26:37

光纖綜合布線

2023-05-17 15:31:03

物聯(lián)網(wǎng)邊緣計(jì)算

2017-07-05 14:09:04

系統(tǒng)設(shè)計(jì)與架構(gòu)java云計(jì)算

2012-03-21 09:54:00

Gzip

2022-06-23 07:05:46

跳板機(jī)服務(wù)器PAM

2023-04-13 16:30:39

物聯(lián)網(wǎng)IoT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號