Junior — Middle
Чӣ гуна рафтор мекунад системав агар дар дохили усули, ки ҳамчун транзаксионӣ ишора шудааст, усули дигаре, ки ҳамчунин бо ёддоштӣ транзаксионӣ ишора шудааст, даъват карда шавад?
sobes.tech AI
Ҷавоб аз AI
ใน Java, เมื่อใช้ธุรกรรม (เช่น ด้วยการแท็ก @Transactional ใน Spring) พฤติกรรมเมื่อเรียกใช้เมธอดอีกอันที่ก็ถูกทำเครื่องหมายว่าเป็นธุรกรรมก็ขึ้นอยู่กับชนิดของ proxy และการตั้งค่าธุรกรรม
โดยค่าเริ่มต้น หากการเรียกนี้เกิดขึ้นภายในคลาสเดียวกัน (การเรียกภายในเมธอด) proxy จะไม่จับการเรียกนี้ และจะไม่สร้างธุรกรรมใหม่ — จะใช้ธุรกรรมปัจจุบัน (ถ้ามี)
หากการเรียกนี้มาจากภายนอก (ผ่าน proxy) แล้ว:
- ด้วย propagation ประเภท
REQUIRED(ค่าเริ่มต้น) จะไม่สร้างธุรกรรมภายในใหม่ จะใช้ธุรกรรมที่มีอยู่แล้ว - ด้วย propagation
REQUIRES_NEWจะสร้างธุรกรรมใหม่ โดยหยุดชั่วคราวธุรกรรมปัจจุบัน
ดังนั้น เมื่อเรียกใช้เมธอดที่เป็นธุรกรรมจากอีกเมธอดที่เป็นธุรกรรมในคลาสเดียวกัน โดยทั่วไปจะใช้ธุรกรรมเดียวกัน และการแท็กซ้อนกันจะไม่สร้างธุรกรรมใหม่
ถ้าต้องการให้เมธอดภายในทำงานในธุรกรรมแยกต่างหาก การเรียกควรทำผ่าน proxy (เช่น ผ่าน bean อื่น หรือผ่าน self-injection)