เมื่อเร็ว ๆ นี้ฉันพบสถานการณ์ที่การทำธุรกรรมไม่ย้อนกลับ ฉันยังพิจารณาว่ามีข้อบกพร่องในการทำธุรกรรมของ JPA หรือไม่? ฉันคิดมากเกินไป ...
เพื่อที่จะพิมพ์บันทึกอย่างชัดเจนฉันเพิ่ม tyrcatch เพื่อพิมพ์บันทึกในการจับ แต่สถานการณ์ที่นี่มา เมื่อวิธีนี้ผิดปกติบันทึกจะถูกพิมพ์ แต่ธุรกรรมที่เพิ่มขึ้นจะไม่ย้อนกลับ
ตัวอย่าง:
วิธีการเช่นนี้จะไม่ย้อนกลับ (ข้อผิดพลาดวิธีหนึ่งวิธีอื่นจะไม่ย้อนกลับ):
if (usersave) {ลอง {userdao.save (ผู้ใช้); usercapabilityquotadao.save (Capabilityquota); } catch (Exception e) {logger.info ("ความสามารถในการเปิดอินเทอร์เฟซ, ข้อยกเว้นการเปิดบัญชี, ข้อมูลข้อยกเว้น:"+e); -วิธีการต่อไปนี้ย้อนกลับ (ข้อผิดพลาดวิธีหนึ่งวิธีอื่นจะย้อนกลับ):
if (usersave) {ลอง {userdao.save (ผู้ใช้); usercapabilityquotadao.save (Capabilityquota); } catch (Exception e) {logger.info ("ความสามารถในการเปิดอินเทอร์เฟซ, ข้อยกเว้นการเปิดบัญชี, ข้อมูลข้อยกเว้น:"+e); โยน runtimeException ใหม่ (); -หรือ:
if (usersave) {ลอง {userdao.save (ผู้ใช้); usercapabilityquotadao.save (Capabilityquota); } catch (Exception e) {logger.info ("ความสามารถในการเปิดอินเทอร์เฟซ, ข้อยกเว้นการเปิดบัญชี, ข้อมูลข้อยกเว้น:"+e); TransactionAspectSupport.currentTransactionstatus (). setRollBackonly (); -ทำไมคุณไม่ออกไป? - มันไม่เข้าใจกลไกการทำธุรกรรมของฤดูใบไม้ผลิ - -
***** ธุรกรรมสปริงเริ่มต้นจะย้อนกลับไปเมื่อเกิด uncaught runtimeExCetpion เกิดขึ้น -
หลักการของการจับข้อยกเว้นของ Springaop: วิธีการสกัดกั้นจำเป็นต้องโยนข้อยกเว้นอย่างชัดเจนและไม่สามารถดำเนินการได้ในทางใดทางหนึ่ง ด้วยวิธีนี้เอเจนต์ AOP สามารถจับข้อยกเว้นของวิธีการและย้อนกลับได้ โดยค่าเริ่มต้น AOP จะจับข้อยกเว้นของ RuntimeException เท่านั้น แต่สามารถผ่านได้
กำหนดค่าให้จับข้อยกเว้นเฉพาะและย้อนกลับ
กล่าวอีกนัยหนึ่งอย่าใช้ trycatch ในวิธีการบริการหรือเพิ่ม thownewruntimeExcetpion () เพื่อจับเพื่อให้โปรแกรมสามารถจับได้โดย AOP และย้อนกลับเมื่อโปรแกรมพิเศษ
สารละลาย:
วิธีแก้ปัญหา 1 ตัวอย่างเช่นหากเลเยอร์บริการจัดการการทำธุรกรรมดังนั้นวิธีการในบริการจะไม่ทำการจับข้อยกเว้นหรือเพิ่มคำสั่ง thownewruntimeException () ลงในคำสั่งจับเพื่อให้ AOP จับข้อยกเว้นแล้วย้อนกลับ
วิธีแก้ปัญหา 2. เพิ่ม: TransactionAspectSupport.currentTransactionStatus (). setRollBackonly (); คำสั่งต่อคำสั่งจับของวิธีการบริการเลเยอร์การย้อนกลับด้วยตนเองเพื่อให้เลเยอร์บนไม่จำเป็นต้องจัดการข้อยกเว้น (การปฏิบัติโครงการปัจจุบัน)
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการวิเคราะห์อินสแตนซ์การย้อนกลับของการทำธุรกรรมสปริง ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!