Sobes.tech
Junior — Middle

Чӣ гуна рафтор мекунад системав агар дар дохили усули, ки ҳамчун транзаксионӣ ишора шудааст, усули дигаре, ки ҳамчунин бо ёддоштӣ транзаксионӣ ишора шудааст, даъват карда шавад?

sobes.tech AI

Ҷавоб аз AI

ใน Java, เมื่อใช้ธุรกรรม (เช่น ด้วยการแท็ก @Transactional ใน Spring) พฤติกรรมเมื่อเรียกใช้เมธอดอีกอันที่ก็ถูกทำเครื่องหมายว่าเป็นธุรกรรมก็ขึ้นอยู่กับชนิดของ proxy และการตั้งค่าธุรกรรม

โดยค่าเริ่มต้น หากการเรียกนี้เกิดขึ้นภายในคลาสเดียวกัน (การเรียกภายในเมธอด) proxy จะไม่จับการเรียกนี้ และจะไม่สร้างธุรกรรมใหม่ — จะใช้ธุรกรรมปัจจุบัน (ถ้ามี)

หากการเรียกนี้มาจากภายนอก (ผ่าน proxy) แล้ว:

  • ด้วย propagation ประเภท REQUIRED (ค่าเริ่มต้น) จะไม่สร้างธุรกรรมภายในใหม่ จะใช้ธุรกรรมที่มีอยู่แล้ว
  • ด้วย propagation REQUIRES_NEW จะสร้างธุรกรรมใหม่ โดยหยุดชั่วคราวธุรกรรมปัจจุบัน

ดังนั้น เมื่อเรียกใช้เมธอดที่เป็นธุรกรรมจากอีกเมธอดที่เป็นธุรกรรมในคลาสเดียวกัน โดยทั่วไปจะใช้ธุรกรรมเดียวกัน และการแท็กซ้อนกันจะไม่สร้างธุรกรรมใหม่

ถ้าต้องการให้เมธอดภายในทำงานในธุรกรรมแยกต่างหาก การเรียกควรทำผ่าน proxy (เช่น ผ่าน bean อื่น หรือผ่าน self-injection)