ปกติเวลาเราเขียน service ของ spring ขึ้นมา เราจะใช้ AOP (Aspect Oriented Programming) ช่วยในการ manage transaction ให้ เพียงแค่ใส่ annotation @Transactional (org.springframework.transaction.annotation.Transactional) ไว้บน class หรือ method ที่ต้องการ เมื่อ spring ทำ reflection มาเจอ มันก็จะเช็คว่า method ไหนต้องการให้มี transaction บ้าง มันก็จะ begin / commit transaction ให้ โดยผ่านทาง proxy method แล้ว proxy method ก็ค่อยไปเรียก method จริงๆ อีกที การทำแบบนี้ถือว่าสะดวกมาก เพราะเราไม่ต้อง manage transaction เอง (spring จัดการให้แล้ว) ซึ่งก็ช่วยลด code ที่ซ้ำซ้อนและไม่สำคัญทาง business logic ออกไปได้ในระดับหนึ่งครับ
แต่การใช้ AOP มันมีเงื่อนไขอยู่ว่า service instance นั้นจะต้องถูกสร้างขึ้นมาจาก spring เท่านั้น (เราจะ new instance เองไม่ได้) เพราะ spring จะต้องเอาไปครอบด้วย proxy method (ทำ AOP) อีกทีครับ
จากเงื่อนไขการใช้ AOP ข้อนี้ทำให้มีบางเหตุการณ์ที่เราไม่สามารถใช้ transaction จาก AOP ได้ เช่น การเรียกใช้งาน method นั้นๆ โดยตรง โดยไม่ผ่าน proxy method ประมาณนี้

