เห็นคำถามในกลุ่ม 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
เพื่อดูการทำงานของระบบ
[gist id="41a5ad66fa143f948c60f4706c08acb3" file="application.properties"]จากนั้นลอง run และดูผล
จะเห็นได้ว่า จะทำการ commit ในแต่ละ repository
นั่นคือเกิด 3 transaction
แต่ถ้าเราต้องการให้ทั้ง 3 repositry ให้อยู่ใน Transaction เดียวกัน
ให้ทำการจัดการในส่วนของ Service Layer ด้วยการใส่ @Transactional ไปดังนี้
[gist id="41a5ad66fa143f948c60f4706c08acb3" file="DemoService2.java"]ผลการทำงานจาก log จะเป็นดังนี้
ซึ่งเป็นไปตามที่ต้องการคือ อยู่ใน transaction เดียวกัน
ดังนั้นถ้ามี repository ใด ที่ fail ขึ้นมา
จะทำการ rollback transaction ให้เอง
จะเห็นว่า เราสามารถจัดการ transaction พื้นฐานใน Service Layer ได้แล้ว
เพื่อให้ต่อยอดต่อไปได้