توفر واجهة SavePoint الجديدة JDBC3.0 تحكمًا إضافيًا للمعاملات. تدعم معظم DBMS الحديثة نقاط Save في بيئاتها مثل Oracle PL/SQL.
تحديد نقطة التراجع المنطقية في المعاملة عند إعداد نقطة حفظ. في حالة حدوث خطأ عند مرور نقطة حفظ ، يمكنك استخدام طريقة التراجع للتراجع عن جميع التغييرات أو التغييرات التي تم إجراؤها إلا بعد نقطة التوفير.
هناك طريقتان جديدتان لكائنات الاتصال للمساعدة في إدارة نقاط التوفير:
setSavePoint (String SavePointName): يحدد SavePoint جديد. كما أنه يرجع كائن SavePoint.
REESESAVEPOINT (SAVEPOINT SAVEPOINTNAME): حذف نقطة حفظ. لاحظ أنه يتطلب كائن SavePoint كمعلمة. عادة ما يتم إنشاء هذا الكائن بطريقة setSavePoint ().
هناك طريقة التراجع (String SavePointName) التي تراجع إلى نقطة التوفير المحددة.
يوضح المثال التالي كيفية استخدام كائن SavePoint:
حاول {// افترض كائن اتصال صالح conn.setautocommit (false) ؛ بيان stmt = conn.createstatement () ؛ // قم بتعيين SavePoint SavePoint1 = Conn.SetSavePoint ("SavePoint1") ؛ String sql = "insert in effect" + "القيم (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. استيراد PackagesImport java.sql.*؛ الفئة العامة jdbcexample {// jdbc اسم برنامج التشغيل و url قاعدة البيانات static static jdbc_driver = "com.mysql.jdbc.driver" ؛ Static Final String db_url = "jdbc: mysql: // localhost/emp" ؛ // بيانات اعتماد قاعدة البيانات user static final user = "username" ؛ Static Final String Pass = "Password" ؛ public static void main (string [] args) {connection conn = null ؛ بيان stmt = فارغة ؛ حاول {// الخطوة 2: تسجيل jdbc class.forname ("com.mysql.jdbc.driver") ؛ // الخطوة 3: فتح نظام اتصال. out.println ("الاتصال بقاعدة البيانات ...") ؛ conn = drivermanager.getConnection (db_url ، user ، pass) ؛ // الخطوة 4: تعيين الالتزام التلقائي كما كاذب. conn.setautocommit (false) ؛ . System.out.println ("إنشاء بيان ...") ؛ stmt = conn.createstatement () ؛ // الخطوة 6: الآن سرد جميع السجلات المتاحة. String SQL = "SELECT ID ، أولاً ، آخر ، العمر من الموظفين" ؛ resultset rs = stmt.executequery (SQL) ؛ system.out.println ("قائمة قائمة المحددة للرجوع إليها ....") ؛ printrs (RS) ؛ // الخطوة 7: حذف الصفوف التي تحتوي على مبشرة معرف من 104 // ولكن حفظ النقطة قبل القيام بذلك. SavePoint SavePoint1 = Conn.SetSavePoint ("Rows_Deleted_1") ؛ System.out.println ("حذف صف ...") ؛ String SQL = "DELETE From Offects" + "where id = 110" ؛ stmt.executeupdate (SQL) ؛ // عفوًا ... حذفنا الموظفين الخاطئين! . // الخطوة 9: حذف الصفوف التي تحتوي على مبشرة معرف من 104 // ولكن حفظ النقطة قبل القيام بذلك. SavePoint SavePoint2 = Conn.SetSavePoint ("Rows_Deleted_2") ؛ System.out.println ("حذف صف ...") ؛ SQL = "DELETE From Offects" + "حيث id = 95" ؛ stmt.executeupdate (SQL) ؛ // الخطوة 10: الآن سرد جميع السجلات المتاحة. SQL = "SELECT ID ، أولاً ، آخر ، العمر من الموظفين" ؛ 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 ("Rolling Back Data هنا ...") ؛ حاول {if (conn! = null) conn.rollback () ؛ } catch (sqlexception se2) {se2.printStackTrace () ؛ } // end try} catch (استثناء e) {// التعامل مع الأخطاء لـ class.forname eprintstacktrace () ؛ } أخيرًا {// أخيرًا كتلة المستخدمة لإغلاق الموارد ، جرب {if (stmt! = null) stmt.close () ؛ } catch (sqlexception se2) {} // لا شيء يمكننا القيام به {if (conn! = null) conn.close () ؛ } catch (sqlexception se) {se.printstacktrace () ؛ } // end أخيرًا حاول} // end try system.out.println ("Goodbye!") ؛} // end main public static printrs (resultset rs) يلقي sqlexception {// تأكد من أن نبدأ بالصف الأول rs.beforefirst () ؛ بينما (rs.next ()) {// استرداد حسب اسم العمود int id = rs.getInt ("id") ؛ int age = rs.getInt ("Age") ؛ سلسلة أولاً = rs.getString ("الأول") ؛ سلسلة last = rs.getString ("last") ؛ // عرض قيم System.out.print ("id:" + id) ؛ System.out.print ("، العمر:" + العمر) ؛ System.out.print ("، أولاً:" + أولاً) ؛ system.out.println ("، last:" + last) ؛ } system.out.println () ؛ } // end printrs ()} // end jdbcexampleالآن دعنا نرسل المثال أعلاه على النحو التالي:
C:> Javac jdbcexample.java
عند تشغيل jdbcexample ، فإنه ينتج النتائج التالية:
C:> Java jdbcexample
الاتصال بقاعدة البيانات ... إنشاء بيان ... قائمة قائمة بالمرجع .... المعرف: 95 ، العمر: 20 ، أولا: Sima ، آخر: Chugid: 100 ، العمر: 18 ، أولاً: زارا ، آخر: عليد: 101 ، أولاً: Sima ، الأخير: chugdeleting صف ... حذف الصف .... قائمة قائمة الإعداد للمرجع .... المعرف: 100 ، العمر: 18 ، أول: زارا ، zara: aliid: 101 ، العمر: 25 ، أولا: ماهناز ، الأخير: فاطميد: 102 ، العمر: 30 ، أول: Zaid ، last: khanid: 103 ، age: first: sumit ، last: last: last: last: last: last: last: last: last: تشوجودبي!