เห็นคำถามในกลุ่ม Spring Developer Thailand
เรื่องการจัดการ transaction ในการบันทึกข้อมูลลง database
ผ่าน repository layer ว่าทำอย่างไร ?
ก่อนที่จะรู้ว่าต้องทำอย่างไร
ควรต้องเข้าใจพฤติกรรมการทำงานพื้นฐานกันก่อน

เริ่มต้นผมลองสร้าง project ด้วย

  • Spring Boot
  • Spring Data JPA ใชสำหรับจัดการกับ database
  • H2 คือ in-memory database

จากนั้นทำการสร้าง Repository 3 ตัวตามคำถามจาก link ในกลุ่ม
ในส่วนของการจัดการบันทึกข้อมูลทั้ง 3 repository
จะทำงานใน Service Layer แบบปกติ ดังนี้

จากนั้นทำการ config เรื่องการแสดง logging ของ Transaction และคำสั่ง SQL

เพื่อดูการทำงานของระบบ

จากนั้นลอง run และดูผล

จะเห็นได้ว่า จะทำการ commit ในแต่ละ repository
นั่นคือเกิด 3 transaction

แต่ถ้าเราต้องการให้ทั้ง 3 repositry ให้อยู่ใน Transaction เดียวกัน

ให้ทำการจัดการในส่วนของ Service Layer ด้วยการใส่ @Transactional ไปดังนี้

ผลการทำงานจาก log จะเป็นดังนี้
ซึ่งเป็นไปตามที่ต้องการคือ อยู่ใน transaction เดียวกัน
ดังนั้นถ้ามี repository ใด ที่ fail ขึ้นมา
จะทำการ rollback transaction ให้เอง

จะเห็นว่า เราสามารถจัดการ transaction พื้นฐานใน Service Layer ได้แล้ว
เพื่อให้ต่อยอดต่อไปได้

Reference Website

P6Spy — มา log SQL จาก JPA กัน