Azure Cosmos DB MongoDB API4.0多文档事务报错Transaction is not active求助
场景与代码
我正在测试多文档事务的简单用例,使用Azure Cosmos DB 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()); // 不同集合的文档 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: Command failed with error 2
(BadValue): 'Error=2, Details='Response status code does not indicate
success: BadRequest (400); Substatus: 1101; ActivityId:
6645fc9e-2c26-4c4a-841d-4a1236b1b7b6; Reason: (Message:
{"Errors":["Transaction is not active"]} ActivityId:
6645fc9e-2c26-4c4a-841d-4a1236b1b7b6, Request URI:
/apps/42c66b5d-4a29-4cc3-8eec-6f40b63129b6/services/102e98fc-69a2-45fe-8b26-4a5ed4c052af/partitions/941605a6-2524-48c2-9937-b518ca9b477e/replicas/133108113341839198p/,
RequestStats:
Microsoft.Azure.Cosmos.Tracing.TraceData.ClientSideRequestStatisticsTraceDatum,
SDK: Windows/10.0.19041 cosmos-netstandard-sdk/3.18.0);' on server
cosmos-core-midware-test-001-westeurope.mongo.cosmos.azure.com:10255.
The full response is {"ok": 0.0, "errmsg": "Error=2, Details='Response
status code does not indicate success: BadRequest (400); Substatus:
1101; ActivityId: 6645fc9e-2c26-4c4a-841d-4a1236b1b7b6; Reason:
(Message: {"Errors":["Transaction is not active"]}\r\nActivityId:
6645fc9e-2c26-4c4a-841d-4a1236b1b7b6, Request URI:
/apps/42c66b5d-4a29-4cc3-8eec-6f40b63129b6/services/102e98fc-69a2-45fe-8b26-4a5ed4c052af/partitions/941605a6-2524-48c2-9937-b518ca9b477e/replicas/133108113341839198p/,
RequestStats:
Microsoft.Azure.Cosmos.Tracing.TraceData.ClientSideRequestStatisticsTraceDatum,
SDK: Windows/10.0.19041 cosmos-netstandard-sdk/3.18.0);", "code": 2,
"codeName": "BadValue"}
测试情况与疑问
经测试,仅插入单个文档时事务可正常运行。请问这是否为MongoDB API版本问题?升级至4.2是否会有所改善?我已知分片集合不支持多文档事务,但不清楚无需分片的数据库实例情况,且认为官方文档对此说明不足。
解答
- API版本限制:Azure Cosmos DB MongoDB API 4.0仅支持单集合内的多文档事务,跨集合的多文档事务在该版本下不被支持,这就是你跨集合插入时报错的核心原因。
- 升级至4.2的作用:升级到MongoDB API 4.2后,非分片实例支持同数据库下的跨集合多文档事务,你的测试场景就能正常运行。
- 非分片实例的事务支持:非分片的Cosmos DB MongoDB API实例中,4.0版本仅支持单集合多文档事务;4.2及以上版本可支持同库跨集合的多文档事务。分片集合无论哪个版本都不支持多文档事务。
- 代码修正点:你的
MyType2Repository泛型声明错误,应该是MongoRepository<MyType2, String>,这个问题可能引发额外异常,建议优先修正。
内容的提问来源于stack exchange,提问作者solujic

