คำสั่งฐานข้อมูลทั้งหมดดำเนินการภายในบริบทของธุรกรรมทางกายภาพแม้ว่าเราจะไม่ได้ประกาศขอบเขตธุรกรรมอย่างชัดเจน (BEGIN / COMMIT / ROLLBACK)
หากคุณไม่ได้ประกาศขอบเขตธุรกรรมอย่างชัดเจนแต่ละคำสั่งจะต้องดำเนินการในธุรกรรมแยกกัน ( autocommit
โหมด) สิ่งนี้อาจนำไปสู่การเปิดและปิดหนึ่งการเชื่อมต่อต่อหนึ่งคำสั่งเว้นแต่สภาพแวดล้อมของคุณสามารถจัดการกับการเชื่อมต่อต่อเธรดได้
การประกาศบริการตามที่@Transactional
จะทำให้คุณมีการเชื่อมต่อหนึ่งรายการสำหรับระยะเวลาการทำธุรกรรมทั้งหมดและคำสั่งทั้งหมดจะใช้การเชื่อมต่อแบบแยกเดี่ยวนั้น นี่เป็นวิธีที่ดีกว่าการไม่ใช้ธุรกรรมที่ชัดเจนตั้งแต่แรก
ในแอปพลิเคชันขนาดใหญ่คุณอาจมีคำขอพร้อมกันจำนวนมากและการลดอัตราการร้องขอการเชื่อมต่อฐานข้อมูลจะช่วยปรับปรุงประสิทธิภาพแอปพลิเคชันโดยรวมของคุณได้อย่างแน่นอน
JPA ไม่บังคับใช้ธุรกรรมในการดำเนินการอ่าน เขียนเฉพาะในตอนท้ายด้วยการโยนข้อยกเว้นที่จำเป็นในการทำธุรกรรมในกรณีที่คุณลืมเริ่มบริบทธุรกรรม อย่างไรก็ตามการประกาศขอบเขตธุรกรรมจะดีกว่าเสมอแม้กระทั่งสำหรับธุรกรรมแบบอ่านอย่างเดียว (ใน Spring @Transactional
ช่วยให้คุณสามารถทำเครื่องหมายธุรกรรมแบบอ่านอย่างเดียวซึ่งมีประโยชน์ด้านประสิทธิภาพที่ยอดเยี่ยม)