成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL和MongoDB事務同步的一種嘗試

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

現象

最近線上的一條數據狀態不對,但是日志又記錄上了。 查看了這條數據的更新邏輯

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中的數據狀態。

很明顯保存mysql成功了,但是更新mongodb的數據失敗了,那為什么保存mongodb的數據失敗了呢? 然后根據日志發現,當時服務器和mongodb連接出現了問題,于是就導致了保存mysql成功,保存到mongodb失敗了。

如何解決?

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

我們可以使用spring中的ChainedTransactionManager來實現鏈式調用

@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 來管理多個事務管理器。當方法執行時,它會按順序開啟所有事務,如果在執行過程中出現異常,它會按相反的順序回滾所有事務。

需要注意的是,這種方法并不能保證 100% 的事務一致性,因為它實際上是在應用層面模擬的分布式事務。在某些極端情況下(比如網絡故障或服務器崩潰),可能會出現部分提交的情況。

比如我們是現在這樣的執行流程

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

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

當然如果業務要求對于這種不一致是可以接受的,或者說我們可以進行手動補償方式達到最終一致性,那這種方案也是可以接受的。

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

責任編輯:武曉燕 來源: think123
相關推薦

2011-03-01 09:43:13

MapReduce架構

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

架構新型計算模型

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

開源

2023-05-17 15:31:03

物聯網邊緣計算

2023-06-02 15:26:37

光纖綜合布線

2015-08-03 09:36:01

賽迪翻譯

2015-08-31 09:27:21

語言界面UI

2017-07-05 14:09:04

系統設計與架構java云計算

2011-04-06 10:09:56

MySQL數據庫安裝

2012-03-21 09:54:00

Gzip

2022-06-23 07:05:46

跳板機服務器PAM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩av | 久色激情| 成人av电影网 | 欧美日韩三级在线观看 | 精品欧美一区二区三区久久久 | 日本精品一区二区三区在线观看视频 | 中文字幕 亚洲一区 | 91精品国产91久久综合桃花 | 日韩网站在线 | 五月激情六月婷婷 | 亚洲第一在线 | 国产精品久久久久无码av | 91精品国产一区二区三区 | 国产日韩欧美在线播放 | 成人国产免费视频 | 一区二区三区四区在线视频 | 亚洲一区二区中文字幕 | 国产伦精品一区二区三区精品视频 | 在线观看成年人视频 | 综合婷婷 | 懂色tv | 精品国产乱码久久久久久图片 | 99视频网站 | 国产精品久久久久久久7777 | 精品日韩一区 | 影音先锋欧美资源 | 精品国产乱码久久久久久中文 | 偷拍亚洲色图 | 91麻豆精品国产91久久久久久久久 | 欧美6一10sex性hd | 亚洲视频www| 精品一区国产 | 久久久久久久一区 | 午夜精品一区二区三区在线视频 | 国产91精品久久久久久久网曝门 | 日韩在线欧美 | av片在线免费看 | 免费麻豆视频 | 天天弄天天操 | 日韩精品二区 | 欧产日产国产精品视频 |