ธุรกรรม
อธิบายธุรกรรม ClientSession ของ MongoDB ใน getTxJob, การแพร่กระจายเซสชันของ Reactor Context, ความรับผิดชอบในการลองใหม่ และขอบเขตธุรกรรมของ Spring
getTxJob
Mono<String> result = dsl.getTxJob(
MongoTemplateName.FRONT,
() -> dsl
.executeEntity(User.class, MongoTemplateName.FRONT)
.save(user)
.then(
dsl.executeEntity(Audit.class, MongoTemplateName.FRONT)
.save(audit)
)
.thenReturn("committed")
);getTxJob(...) จะเปิด ClientSession โดยใช้ MongoExecutionContext.startSession() และเริ่มธุรกรรม จากนั้นจะใส่การผูกเซสชันใน Reactor Context เมื่อเสร็จสิ้นปกติจะทำการ commit, หากเกิดข้อผิดพลาด/ยกเลิกจะทำการ abort ธุรกรรมที่ใช้งานอยู่ และสุดท้ายจะปิดเซสชันตามลำดับ
ขอบเขตเซสชัน
เซสชันธุรกรรมจะถูกแพร่กระจายไปยังการดำเนินการ DSL เดียวกันโดย MongoExecutionContext#getSessionScope() DriverMongoExecutionContext พื้นฐานจะใช้ MongoClient ของตนเองเป็นขอบเขตเซสชัน
การลองทำธุรกรรมใหม่เป็นความรับผิดชอบของผู้เรียก.
getTxJob(...) จะไม่ลองทำธุรกรรม MongoDB ที่เกิดข้อผิดพลาดเช่น TransientTransactionError โดยอัตโนมัติ การตัดสินใจว่าจะลองทำใหม่หรือจำนวนครั้งขึ้นอยู่กับความเป็นอัตลักษณ์ของการดำเนินการ ผลข้างเคียงภายนอก และกฎทางธุรกิจที่รู้จักโดยแอปพลิเคชันที่เรียก.
ขอบเขตของธุรกรรม Spring.
Spring @Transactional / TransactionalOperator.
ขอบเขตของธุรกรรม/เซสชันที่จัดการโดย Spring Data MongoDB.
ReactiveMongoDsl#getTxJob.
DSL เริ่ม ClientSession โดยตรงและส่งต่อไปยัง Reactor Context.