ธุรกรรม

อธิบายธุรกรรม ClientSession ของ MongoDB ใน getTxJob, การแพร่กระจายเซสชันของ Reactor Context, ความรับผิดชอบในการลองใหม่ และขอบเขตธุรกรรมของ Spring


getTxJob

java
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.