إذا كان اتصال JDBC في وضع AutoCommit ، فهو بشكل افتراضي ، فكل عبارة SQL ملتزمة بقاعدة البيانات عند اكتمالها.
قد يكون هذا للتطبيقات البسيطة ، ولكن لثلاثة أسباب قد ترغب في إيقاف تشغيل الالتزام التلقائي وإدارة المعاملات الخاصة بك:
للتحكم في المعاملات وعندما يتم تطبيق التغييرات على قاعدة البيانات. يستغرق عبارة SQL واحدة أو مجموعة من عبارات SQL كوحدة منطقية ، وإذا فشل أي عبارة ، تفشل المعاملة بأكملها.
لتمكين ، بدلاً من برامج تشغيل JDBC باستخدام دعم المعاملات اليدوي وضع الالتزام التلقائي بشكل افتراضي ، استخدم طريقة setautocommit () لكائن الاتصال. إذا تم تمرير قيمة منطقية إلى setautocommit () ، فقم بإيقاف الالتزام التلقائي. يمكن تمرير قيمة منطقية إلى صدق لإعادة فتحها.
على سبيل المثال ، إذا كان هناك كائن يسمى Conn Connection ، فسيقوم الرمز التالي بإيقاف الالتزام التلقائي:
conn.setautocommit (false) ؛
إرسال وتراجع
بمجرد الانتهاء من التغييرات ، تريد ارتكاب التغييرات ثم استدعاء طريقة الالتزام (على كائن الاتصال) على النحو التالي:
conn.Commit () ؛
خلاف ذلك ، فإن التحديثات التراجعية التي يتم إجراؤها على قاعدة البيانات تستخدم Connection Conn ، باستخدام الكود التالي:
conn.rollback () ؛
يوضح المثال التالي كيفية استخدام كائن الالتزام والتراجع:
حاول {// افترض كائن اتصال صالح conn.setautocommit (false) ؛ بيان stmt = conn.createstatement () ؛ String sql = "insert in effect" + "القيم (106 ، 20 ، 'Rita' ، 'Tez')" ؛ stmt.executeupdate (SQL) ؛ // إرسال بيان SQL مشوه الذي يكسر SQL = "إدراج في الموظفين" + "القيم (107 ، 22 ،" SITA "،" Singh ")" ؛ stmt.executeupdate (SQL) ؛ // إذا لم يكن هناك خطأ. conn.Commit () ؛} catch (sqlexception se) {// إذا كان هناك أي خطأ. conn.rollback () ؛}في هذه الحالة ، لن ينجح أي بيان إدراج أعلاه وسيتم التراجع عن كل شيء.
أمثلة ارتكاب المعاملات وتراجعها
فيما يلي مثال على استخدام وصف المعاملات والتراجع.
تم تعلم رمز العينة هذا استنادًا إلى تثبيت البيئة وقاعدة البيانات في الفصل السابق.
انسخ 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) ؛ // الخطوة 5: قم بتنفيذ استعلام لإنشاء إحصاء مع // وسيطات مطلوبة لمثال RS. System.out.println ("إنشاء بيان ...") ؛ stmt = conn.createStatement (resultset.type_scroll_insensitive ، resultset.concur_updatable) ؛ // الخطوة 6: أدخل صفًا في جدول الموظفين. String sql = "insert in effect" + "القيم (106 ، 20 ، 'Rita' ، 'Tez')" ؛ stmt.executeupdate (SQL) ؛ // الخطوة 7: أدخل صفًا آخر في جدول الموظفين SQL = "إدراج في الموظفين" + "قيم (107 ، 22 ،" SITA "،" سينغ ")" ؛ stmt.executeupdate (SQL) ؛ // الخطوة 8: ارتكاب البيانات هنا. System.out.println ("Commiting Data هنا ....") ؛ conn.Commit () ؛ // الخطوة 9: الآن سرد جميع السجلات المتاحة. String SQL = "SELECT ID ، أولاً ، آخر ، العمر من الموظفين" ؛ resultset 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
التواصل مع قاعدة البيانات ... إنشاء بيان ... إدراج صف واحد .... ارتكاب بيانات هنا .... قائمة قائمة الإعداد للرجوع إليها .... المعرف: 100 ، العمر ، أول: Zara ، آخر: Aliid: 101 ، 101 ، العمر ، أولا: Mahnaz ، آخر: آخر: آخر: Mitt: أول: 106 ، 106 ، 106 ، 106 ، العشرين ، Tezid: 107 ، العمر: 22 ، أولا: سيتا ، الأخير: سينغودبي!