Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

การจัดการ Transaction แบบง่าย ๆ กับ Spring Data JPA

$
0
0

เห็นคำถามในกลุ่ม 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 แบบปกติ ดังนี้

[gist id="41a5ad66fa143f948c60f4706c08acb3" file="DemoService.java"]

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

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

[gist id="41a5ad66fa143f948c60f4706c08acb3" file="application.properties"]

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

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

[gist id="41a5ad66fa143f948c60f4706c08acb3" file="1.log"]

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

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

[gist id="41a5ad66fa143f948c60f4706c08acb3" file="DemoService2.java"]

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

[gist id="41a5ad66fa143f948c60f4706c08acb3" file="2.log"]

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


Viewing all articles
Browse latest Browse all 1997

Trending Articles