อินเตอร์เฟส SavePoint JDBC3.0 ใหม่ให้การควบคุมการทำธุรกรรมเพิ่มเติม DBMS ที่ทันสมัยส่วนใหญ่รองรับ SavePoints ในสภาพแวดล้อมของพวกเขาเช่น Oracle PL/SQL
กำหนดจุดย้อนกลับแบบลอจิคัลในการทำธุรกรรมเมื่อตั้งค่าจุดบันทึก หากเกิดข้อผิดพลาดเมื่อ SavePoint ผ่านไปคุณสามารถใช้วิธีการย้อนกลับเพื่อยกเลิกการเปลี่ยนแปลงทั้งหมดหรือการเปลี่ยนแปลงที่เกิดขึ้นหลังจาก SavePoint เท่านั้น
มีสองวิธีใหม่สำหรับวัตถุเชื่อมต่อเพื่อช่วยจัดการ SavePoints:
SetSavePoint (String SavePointName): กำหนด SavePoint ใหม่ นอกจากนี้ยังส่งคืนวัตถุ SavePoint
ReleaseSavePoint (SavePoint SavePointName): ลบ SavePoint โปรดทราบว่าต้องใช้วัตถุ SavePoint เป็นพารามิเตอร์ วัตถุนี้มักจะถูกสร้างขึ้นโดยวิธี SetSavePoint ()
มีวิธีการย้อนกลับ (String SavePointName) ที่หมุนกลับไปที่ SavePoint ที่ระบุ
ตัวอย่างต่อไปนี้แสดงวิธีใช้วัตถุ SavePoint:
ลอง {// สมมติว่าวัตถุการเชื่อมต่อที่ถูกต้อง Conn.SetAutocommit (เท็จ); คำสั่ง stmt = conn.createstatement (); // ตั้งค่า savepoint savepoint savepoint1 = conn.setsavepoint ("savepoint1"); String SQL = "แทรกเข้าไปในพนักงาน" + "ค่า (106, 20, 'rita', 'tez')"; stmt.executeUpdate (SQL); // ส่งคำสั่ง SQL ที่ไม่ถูกต้องซึ่งทำลายสตริง SQL = "แทรกในพนักงาน" + "ค่า (107, 22, 'SITA', 'TEZ')"; stmt.executeUpdate (SQL); // หากไม่มีข้อผิดพลาดให้ทำการเปลี่ยนแปลง conn.Commit ();} catch (sqlexception se) {// หากมีข้อผิดพลาดใด ๆ conn.rollback (savepoint1);} ในกรณีนี้ไม่มีคำสั่งแทรกข้างต้นจะประสบความสำเร็จและทุกอย่างจะถูกย้อนกลับ
ด้านล่างเป็นตัวอย่างของการใช้ SetSavePoint และการสอนการทำธุรกรรมเพื่ออธิบายการย้อนกลับ
รหัสตัวอย่างนี้ขึ้นอยู่กับการติดตั้งสภาพแวดล้อมและฐานข้อมูลในบทก่อนหน้าได้รับการอธิบาย
คัดลอกตัวอย่างต่อไปนี้ jdbcexample.java, รวบรวมและเรียกใช้ดังนี้:
// ขั้นตอนที่ 1. นำเข้าแพ็คเกจที่ต้องการ java.sql.*; คลาสสาธารณะ JDBCEXAMPLE {// ชื่อไดรเวอร์ JDBC และ URL ฐานข้อมูลคงที่สตริงสุดท้าย jdbc_driver = "com.mysql.jdbc.driver"; สตริงสุดท้ายคงที่ db_url = "jdbc: mysql: // localhost/emp"; // ข้อมูลรับรองฐานข้อมูลสตริงสุดท้ายคงที่ user = "ชื่อผู้ใช้"; สตริงสุดท้ายคงที่ = "รหัสผ่าน"; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {การเชื่อมต่อ conn = null; คำสั่ง stmt = null; ลอง {// ขั้นตอนที่ 2: ลงทะเบียนคลาสไดรเวอร์ JDBC forName ("com.mysql.jdbc.driver"); // ขั้นตอนที่ 3: เปิดระบบการเชื่อมต่อ. out.println ("การเชื่อมต่อกับฐานข้อมูล ... "); conn = drivermanager.getConnection (db_url, ผู้ใช้, ผ่าน); // ขั้นตอนที่ 4: ตั้งค่าอัตโนมัติให้เป็นเท็จ conn.setautocommit (เท็จ); // ขั้นตอนที่ 5: ดำเนินการค้นหาเพื่อลบสถิติด้วย // อาร์กิวเมนต์ที่จำเป็นสำหรับตัวอย่าง RS System.out.println ("การสร้างคำสั่ง ... "); stmt = conn.createstatement (); // ขั้นตอนที่ 6: ตอนนี้แสดงรายการบันทึกที่มีอยู่ทั้งหมด String SQL = "SELECT ID, FIRST, LANT, อายุจากพนักงาน"; resultset rs = stmt.executeQuery (SQL); System.out.println ("รายการผลลัพธ์สำหรับการอ้างอิง .... "); Printrs (RS); // ขั้นตอนที่ 7: ลบแถวที่มี ID ขูดมากกว่า 104 // แต่บันทึกจุดก่อนทำเช่นนั้น SavePoint savepoint1 = conn.setsavepoint ("rows_deleted_1"); System.out.println ("การลบแถว ... "); String sql = "ลบจากพนักงาน" + "โดยที่ id = 110"; stmt.executeUpdate (SQL); // อ๊ะ ... เราลบพนักงานผิดเกินไป! // ขั้นตอนที่ 8: ย้อนกลับการเปลี่ยนแปลง AFETR บันทึกจุด 2. Conn.RollBack (SAVEPOINT1); // ขั้นตอนที่ 9: ลบแถวที่มี ID ขูดมากกว่า 104 // แต่บันทึกจุดก่อนทำเช่นนั้น SAVEPOINT SAVEPOINT2 = Conn.SetSavePoint ("ROWS_DELETED_2"); System.out.println ("การลบแถว ... "); sql = "ลบจากพนักงาน" + "โดยที่ id = 95"; stmt.executeUpdate (SQL); // ขั้นตอนที่ 10: ตอนนี้แสดงรายการบันทึกที่มีอยู่ทั้งหมด SQL = "SELECT ID, FIRST, LANT, อายุจากพนักงาน"; rs = stmt.executeQuery (SQL); System.out.println ("รายการผลลัพธ์สำหรับการอ้างอิง ... "); Printrs (RS); // ขั้นตอนที่ 10: สภาพแวดล้อมการทำความสะอาด rs.close (); stmt.close (); conn.close (); } catch (sqlexception se) {// จัดการข้อผิดพลาดสำหรับ jdbc se.printstacktrace (); // หากมีข้อผิดพลาดให้ย้อนกลับการเปลี่ยนแปลง System.out.println ("ย้อนกลับข้อมูลที่นี่ ... "); ลอง {ถ้า (conn! = null) conn.rollback (); } catch (sqlexception se2) {se2.printstacktrace (); } // end try} catch (exception e) {// จัดการข้อผิดพลาดสำหรับ class.forName E.printStackTrace (); } ในที่สุด {// ในที่สุดบล็อกที่ใช้ในการปิดทรัพยากรลอง {ถ้า (stmt! = null) stmt.close (); } catch (sqlexception se2) {} // ไม่มีอะไรที่เราสามารถลอง {ถ้า (conn! = null) conn.close (); } catch (sqlexception se) {se.printstacktrace (); } // สิ้นสุดในที่สุดลอง} // end try system.out.println ("ลาก่อน!");} // สิ้นสุดโมฆะ printrs สาธารณะหลัก (Resultet Rs) พ่น sqlexception {// ตรวจสอบให้แน่ใจว่าเราเริ่มต้นด้วยแถวแรก ในขณะที่ (Rs.Next ()) {// ดึงโดยชื่อคอลัมน์ ID ID = rs.getInt ("id"); อายุ int = Rs.getInt ("อายุ"); String First = Rs.getString ("First"); String last = rs.getString ("สุดท้าย"); // แสดงค่า system.out.print ("id:" + id); System.out.print (", อายุ:" + อายุ); System.out.print (", First:" + First); System.out.println (", สุดท้าย:" + สุดท้าย); } system.out.println (); } // end printrs ()} // end jdbcexampleตอนนี้เรามารวบรวมตัวอย่างข้างต้นกันดังนี้:
c:> javac jdbcexample.java
เมื่อเรียกใช้ JDBCEXAMPLE มันจะให้ผลลัพธ์ต่อไปนี้:
c:> java jdbcexample
การเชื่อมต่อกับฐานข้อมูล ... การสร้างคำสั่ง ... รายการผลลัพธ์สำหรับการอ้างอิง .... ID: 95, อายุ: 20, แรก: SIMA, สุดท้าย: Chugid: 100, อายุ: 18, แรก: Zara, สุดท้าย: Aliid: 101, อายุ: 25, First: Mahnaz, Last: Fatmaid: 102, อายุ: อายุ: zaid ครั้งแรก: Sima, สุดท้าย: chugdeleting แถว ... การลบแถว .... รายการผลลัพธ์สำหรับการอ้างอิง .... id: 100, อายุ: 18, แรก: zara, สุดท้าย: Aliid: 101, อายุ: 25, แรก: mahnaz, สุดท้าย: fatmaid: 102, อายุ: 30, แรก: zaid, สุดท้าย: Khanid Chuggoodbye!