我正在测试多文档事务的简单用例。
但上下文更具体。
我使用的是Azure Cosmos数据库和MongoDB API 4.0。
这是一个示例代码(我想使用MongoRepository接口来实现):
@Transactional(value = "mongoTransactionManager", propagation = Propagation.REQUIRED)
public void saveData() {
repoType1.insert(MyType1.builder().id("1").build());
repoType1.insert(MyType1.builder().id("2").build());
// different document
repoType2.insert(MyType2.builder().id("1234567").build());
if (true) {
throw new RuntimeException("should rollback everything!");
}
repoType1.insert(
MyType1.builder().id("3").build());
}
@Bean
MongoTransactionManager mongoTransactionManager(MongoDatabaseFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
@Repository
@Transactional(value = "mongoTransactionManager", propagation = Propagation.REQUIRED)
public interface MyType1Repository
extends MongoRepository<MyType1, String> {
}
@Repository
@Transactional(value = "mongoTransactionManager", propagation = Propagation.REQUIRED)
public interface MyType2Repository
extends MongoRepository<MyType1, String> {
}
但我不断收到以下错误:
com.mongodb.MongoCommandException:命令失败,错误为2(BadValue):'Error=2,Details ='响应状态代码未指示成功:错误请求(400);子状态:1101;活动ID:6645fc9e-2c26-4c4a-841d-4a1236b1b7b6;原因:(消息:{“错误”:[“事务未处于活动状态”]}活动ID:6645 fc 9 e-2c 26 - 4c 4a-841 d-4a 1236 b1 b7 b6,请求的URI为:/apps/42 c66 b5 d-4a 29 - 4cc 3 - 8 eec-6 f40 b63129 b6/服务/102 e98 fc-69 a2 - 45 fe-8b 26 - 4a 5ed 4c 052 af/分区/副本/133108113341839198 p/,请求统计信息:Microsoft.Azure.宇宙.跟踪.跟踪数据.客户端请求统计信息跟踪数据,SDK:Windows/10.0.19041宇宙网络标准SDK/3.18.0);'的完整回应是{“确定”:0.0,“错误消息”:“Error=2,Details =”响应状态代码未指示成功:错误请求(400);子状态:1101;活动ID:6645fc9e-2c26-4c4a-841d-4a1236b1b7b6;原因:(消息:{“错误”:[“事务未处于活动状态”]}\r\n活动ID:6645 fc 9 e-2c 26 - 4c 4a-841 d-4a 1236 b1 b7 b6,请求的URI为:/apps/42 c66 b5 d-4a 29 - 4cc 3 - 8 eec-6 f40 b63129 b6/服务/102 e98 fc-69 a2 - 45 fe-8b 26 - 4a 5ed 4c 052 af/分区/副本/133108113341839198 p/,请求统计信息:Microsoft.Azure.宇宙.跟踪.跟踪数据.客户端请求统计信息跟踪数据,SDK:Windows/10.0.19041宇宙网络标准SDK/3.18.0);“,“代码”:2,“代码名称”:“错误值”}
我测试了该事务,当只对单个文档调用insert时,它可以正常工作。
这可能是MongoDB API版本的问题吗?(升级到4.2.会有什么不同吗?)
从Azure宇宙数据库MongoDB API 4.2.文档:
对我来说,这是非常糟糕的记录,我知道分片集合不支持多文档事务,但是不需要分片的数据库示例呢?
1条答案
按热度按时间hjzp0vay1#
这与文档本身是否在不同的碎片上无关,它适用于集合本身是作为固定的还是碎片创建的。
Cosmos DB for MongoDB中有一篇文章专门讨论了这一点,Use Multi-document transactions in Azure Cosmos DB for MongoDB
如果使用Azure门户创建,则需要在此处选择突出显示的项目。