1. ตัวอย่างสถานการณ์การใช้งาน
ก่อนที่เราจะเข้าใจวิธีการใช้ @Transactional เราต้องรู้ก่อนว่า @Transactional มีประโยชน์อะไร ให้ฉันยกนิ้วให้คุณ: ตัวอย่างเช่นมีสมาชิกจำนวนมากในแผนกและทั้งสองถูกเก็บไว้ในตารางแผนกและตารางสมาชิกตามลำดับ เมื่อลบแผนกบางแผนกสมมติว่าเราจะลบสมาชิกที่เกี่ยวข้องโดยค่าเริ่มต้น อย่างไรก็ตามสิ่งนี้อาจเกิดขึ้นระหว่างการดำเนินการ ก่อนอื่นเราลบแผนกแล้วลบสมาชิก อย่างไรก็ตามแผนกได้ลบออกไปแล้วและมีข้อยกเว้นเกิดขึ้นเมื่อลบสมาชิก ในเวลานี้เราหวังว่าหากการลบสมาชิกล้มเหลวแผนกที่ถูกลบก่อนหน้านี้จะยกเลิกการลบ สถานการณ์นี้สามารถย้อนกลับมาได้โดยใช้ @Transactional Things
2. ตรวจสอบข้อยกเว้นและข้อยกเว้นที่ไม่ได้ตรวจสอบ
เหตุผลที่เราแจ้งให้ทุกคนทราบแนวคิดของข้อยกเว้นที่ตรวจสอบและข้อยกเว้นที่ไม่ได้ตรวจสอบคือ:
ฤดูใบไม้ผลิใช้การประมวลผลธุรกรรมที่ประกาศ โดยค่าเริ่มต้นหากข้อยกเว้นที่ไม่ได้ตรวจสอบเกิดขึ้นในวิธีการดำเนินการฐานข้อมูลหมายเหตุประกอบการดำเนินการฐานข้อมูลทั้งหมดจะกลับมาอีกครั้ง หากข้อยกเว้นเกิดขึ้นเป็นข้อยกเว้นที่ตรวจสอบการดำเนินการฐานข้อมูลจะยังคงถูกส่งตามค่าเริ่มต้น
ตรวจสอบข้อยกเว้น:
ไม่ถูกต้องไม่สามารถคาดการณ์ได้ในโปรแกรม ตัวอย่างเช่นอินพุตผู้ใช้ที่ไม่ถูกต้องไฟล์ไม่มีอยู่, เครือข่ายหรือข้อผิดพลาดลิงก์ฐานข้อมูล นี่คือเหตุผลภายนอกทั้งหมดและไม่ได้ควบคุมโดยโปรแกรม
ต้องจัดการอย่างชัดเจนในรหัส ตัวอย่างเช่นการประมวลผลบล็อกลองจับหรือโยนข้อยกเว้นไปยังเลเยอร์ก่อนหน้าของสแต็กการโทรด้วยคำอธิบายการโยน
สืบทอดมาจาก java.lang.exception (ยกเว้น java.lang.runtimeException)
ข้อยกเว้นที่ไม่ได้ตรวจสอบ:
ระบุข้อผิดพลาดตรรกะของโปรแกรมผิด มันเป็นคลาสย่อยของ runtimeException เช่น unledalargumentException, nullpointerexception และ unlilmandalstateException
ไม่จำเป็นต้องจับข้อยกเว้นที่ไม่ได้ตรวจสอบอย่างชัดเจนในรหัสสำหรับการประมวลผล
สืบทอดมาจาก java.lang.runtimeException (และ java.lang.runtimeException สืบทอดมาจาก java.lang.exception)
เมื่อมองไปที่แผนภาพโครงสร้างที่ผิดปกติด้านล่างอาจมีชั้นมากขึ้น:
3. ตัวอย่างการใช้ @Transactional
ตัวอย่างนี้ใช้ Eclipse+Maven Maven ได้รับการจัดการเป็นโถเท่านั้นและแม้แต่ Ape Friends of Maven ที่ไม่เข้าใจก็สามารถเข้าใจได้
3.1. ไฟล์การกำหนดค่าสปริง
เนมสเปซ TX จะต้องกำหนดค่าก่อนดังนี้:
ในการใช้การจัดการธุรกรรมตามธุรกรรมจำเป็นต้องมีการกำหนดค่าต่อไปนี้ในฤดูใบไม้ผลิ:
<bean id = "apptransactionmanager"> <property name = "dataSource" ref = "dataSource" /> </ebean> <tx: คำอธิบายประกอบที่ขับเคลื่อน
ไฟล์การกำหนดค่าฤดูใบไม้ผลิทั้งหมดของบล็อกเกอร์:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http:/ XSI: schemalocation = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://ww.springframework http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context <!-แนะนำไฟล์การกำหนดค่า JDBC-> <bean id = "PropertyConfigurer"> <property name = "locations"> <list> <value> classpath: คุณสมบัติ/*. คุณสมบัติ </value> <!-หากมีการกำหนดค่าหลายไฟล์ คุณสมบัติ-> <!-กำหนดค่าคุณสมบัติ-> <!-กำหนดค่าคุณสมบัติ-> <!-<property name = "driverclassName" value = "com.mysql.jdbc.driver" /> <property name = "url" value = "jdbc: mysql: // localhost: 3306 / value = "Christmas258@"/>-> <!-ใช้คุณสมบัติในการกำหนดค่า-> <property name = "driverclassName"> <value> $ {jdbc_driverclassName} </value> </porement> <value> $ {JDBC_USERNAME} </value> </คุณสมบัติ> <property name = "รหัสผ่าน"> <value> $ {jdbc_password} </value> </property> </ebean> <bean id = "AppTransactionManager"> <property name = "DataSource Proxy-target-class = "false" transaction-manager = "AppTransactionManager" /> <!-สแกนไฟล์อินเทอร์เฟซ MAPPER ทั้งหมดโดยอัตโนมัติที่สอดคล้องกับ XXXXMAPPER.XML โดยอัตโนมัติเพื่อที่คุณจะได้ไม่ต้องกำหนดค่าการแมป MPPER ด้วยตนเอง ตราบใดที่คลาสอินเตอร์เฟส Mapper และไฟล์การแมปแผนที่สอดคล้องกัน -> <bean> <property name = "basepackage" value = "com.luo.dao" /> </ebean> <!-กำหนดค่าไฟล์ mybatis, mapperlocations กำหนดค่า ** mapper.xml ตำแหน่งไฟล์การกำหนดค่า mybatis-config <property name = "mapperlocations" value = "classpath: mapper/*. xml"/> <property name = "configlocation" value = "classpath: mybatis/mybatis-config.xml"/> <! -> <บริบท: Component-Scan base-package = "com.luo.service" /> </ebeans>3.2. ใช้ @Transactional เพื่อเพิ่มคำอธิบายประกอบในวิธีการใช้คลาสการใช้งานผู้ใช้
@Transactional (การแพร่กระจาย = การแพร่กระจาย. ต้องการ) โมฆะสาธารณะ Adduser (ผู้ใช้ผู้ใช้) {userDao.Adduser (ผู้ใช้); สตริงสตริง = null; if (string.equals ("")) {int i = 0; -ในวิธีการข้างต้นฉันจงใจทำให้มันมีข้อยกเว้นตัวชี้โมฆะและสิ่งต่าง ๆ จะย้อนกลับไป
3.3. เรียกใช้คลาสทดสอบหน่วย
@Test โมฆะสาธารณะ addUserTest () {ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setUserName ("luoguohui1"); user.setUserPassword ("luoguohui1"); userservice.adduser (ผู้ใช้);}ฉันพบว่ามันไม่สามารถแทรกได้ แต่ถ้า @Transactional ถูกลบรหัสจะมีดังนี้ แม้ว่าจะมีข้อยกเว้นเกิดขึ้น แต่ก็ยังมีข้อมูลที่เกี่ยวข้องกับฐานข้อมูล:
3.4. ดาวน์โหลดซอร์สโค้ด
ดาวน์โหลดซอร์สโค้ดสุดท้ายของบทความนี้: first_maven_project_jb51.rar
4. แนวคิดที่ @Transactional ในฤดูใบไม้ผลิต้องเข้าใจ
@Transactional ในฤดูใบไม้ผลิขึ้นอยู่กับกลไกพร็อกซีแบบไดนามิกและให้กลไกการจัดการธุรกรรมที่โปร่งใสเพื่ออำนวยความสะดวกและแก้ปัญหาที่พบในการพัฒนาได้อย่างรวดเร็ว
โดยทั่วไปคือการแสดงความคิดเห็นวิธีการหรืออินเทอร์เฟซหรือคลาสผ่านรหัสต่อไปนี้:
@Transactional (การแพร่กระจาย = การแพร่กระจาย
การแพร่กระจายรองรับกลไกการแพร่กระจายที่แตกต่างกัน 7 ข้อ:
จำเป็น: หากมีการทำธุรกรรมอยู่การทำธุรกรรมปัจจุบันจะได้รับการสนับสนุน หากไม่มีธุรกรรมการทำธุรกรรมใหม่จะเริ่มขึ้น
รองรับ: หากมีการทำธุรกรรมอยู่การทำธุรกรรมปัจจุบันจะได้รับการสนับสนุน หากไม่มีธุรกรรมการดำเนินการของการไม่ทำธุรกรรม อย่างไรก็ตามสำหรับผู้จัดการธุรกรรมการทำธุรกรรมการทำธุรกรรม Propagation_supports นั้นแตกต่างจากการไม่ใช้ธุรกรรมเล็กน้อย
NOT_SUPPORTED: ดำเนินการที่ไม่ใช่การแก้ไขและระงับธุรกรรมที่มีอยู่เสมอ
ต้องใช้เวลา: เริ่มทำธุรกรรมใหม่เสมอ หากมีการทำธุรกรรมอยู่แล้วธุรกรรมที่มีอยู่จะถูกระงับ
บังคับ: หากมีการทำธุรกรรมอยู่แล้วให้รองรับธุรกรรมปัจจุบัน หากไม่มีธุรกรรมที่ใช้งานอยู่จะมีการโยนข้อยกเว้น
ไม่เคย: ดำเนินการที่ไม่ใช่การทำธุรกรรมเสมอหากมีการทำธุรกรรมที่ใช้งานอยู่จะมีการโยนข้อยกเว้น
ซ้อนกัน: หากมีการทำธุรกรรมที่ใช้งานอยู่มันจะทำงานในธุรกรรมซ้อนกัน หากไม่มีธุรกรรมที่ใช้งานอยู่ให้กดคุณสมบัติที่ต้องการเพื่อดำเนินการ
นี่คือบางสิ่งที่ควรทราบซึ่งจะต้องอ่านมิฉะนั้นถ้าคุณพบข้อผิดพลาดที่หลากหลายบล็อกเกอร์ไม่ได้เตือนคุณ:
นี่คือบางสิ่งที่ควรทราบซึ่งจะต้องอ่านมิฉะนั้นถ้าคุณพบข้อผิดพลาดที่หลากหลายบล็อกเกอร์ไม่ได้เตือนคุณ:
นี่คือบางสิ่งที่ควรทราบซึ่งจะต้องอ่านมิฉะนั้นถ้าคุณพบข้อผิดพลาดที่หลากหลายบล็อกเกอร์ไม่ได้เตือนคุณ:
เพิ่ม @Transactional คำอธิบายประกอบที่จำเป็นต้องมีการจัดการธุรกรรม @Transactional คำอธิบายประกอบสามารถนำไปใช้กับคำจำกัดความของอินเตอร์เฟสและวิธีการเชื่อมต่อคำจำกัดความของคลาสและวิธีการสาธารณะของคลาส
@Transactional Annotations สามารถนำไปใช้กับวิธีการที่มีการมองเห็นสาธารณะเท่านั้น หากคุณใช้คำอธิบายประกอบ @Transactional บนวิธีการป้องกันส่วนตัวหรือแพ็คเกจที่มองเห็นได้มันจะไม่รายงานข้อผิดพลาด แต่วิธีการที่มีคำอธิบายประกอบนี้จะไม่แสดงการตั้งค่าธุรกรรมที่กำหนดค่าไว้
โปรดทราบว่าการเกิดขึ้นของคำอธิบายประกอบ @Transactional นั้นไม่เพียงพอที่จะเปิดใช้งานพฤติกรรมการทำธุรกรรมมันเป็นเพียงข้อมูลเมตา องค์ประกอบการกำหนดค่าจะต้องใช้ในไฟล์การกำหนดค่าเพื่อเปิดใช้งานพฤติกรรมการทำธุรกรรมอย่างแท้จริง
ควบคุมว่าพร็อกซีที่อิงกับอินเทอร์เฟซหรือคลาสนั้นถูกสร้างขึ้นผ่านค่าแอตทริบิวต์ "พร็อกซี-เป้าหมายระดับ" ขององค์ประกอบ หากค่าประเภท "พร็อกซี-เป้าหมายระดับ" ถูกตั้งค่าเป็น "จริง" พร็อกซีที่ใช้คลาสจะทำงาน (จำเป็นสำหรับ cglib.jar ใน classpath) หากค่าประเภท "พร็อกซี-เป้าหมาย-คลาส" ถูกตั้งค่าเป็น "เท็จ" หรือคุณสมบัตินี้ถูกละเว้นพร็อกซีที่ใช้อินเตอร์เฟส JDK มาตรฐานจะทำงานได้
ทีมฤดูใบไม้ผลิแนะนำให้ใช้คำอธิบายประกอบ @Transactional ในคลาสที่เฉพาะเจาะจง (หรือวิธีการของคลาส) มากกว่าในอินเทอร์เฟซใด ๆ ที่คลาสต้องการนำไปใช้ การใช้คำอธิบายประกอบ @Transactional บนอินเทอร์เฟซจะมีผลเฉพาะเมื่อคุณตั้งค่าพร็อกซีที่ใช้อินเตอร์เฟส เนื่องจากคำอธิบายประกอบไม่สามารถสืบทอดได้ซึ่งหมายความว่าหากมีการใช้พร็อกซีในชั้นเรียนการตั้งค่าการทำธุรกรรมจะไม่ได้รับการยอมรับจากพร็อกซีที่ใช้คลาสและวัตถุจะไม่ถูกห่อหุ้มด้วยพร็อกซีธุรกรรม
การทำธุรกรรมของ @transactional ถูกเปิดใช้งานไม่ว่าจะเป็นอินเทอร์เฟซที่ใช้หรือพร็อกซีที่ใช้คลาส ดังนั้นในคลาสเดียวกันวิธีหนึ่งเรียกวิธีการอื่นด้วยธุรกรรมการทำธุรกรรมจะไม่ทำงาน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น