معاملات جيديس
عندما نستخدم JDBC للاتصال بـ MySQL ، نحتاج إلى بدء المعاملة قبل تنفيذ عبارة SQL ؛ في MyBatis ، نحتاج أيضًا إلى استخدام OpenSession () للحصول على كائن معاملة الجلسة لأداء تنفيذ SQL والاستعلام والعمليات الأخرى. عندما تنتهي تشغيلنا على قاعدة البيانات ، يكون كائن المعاملة مسؤولاً عن إغلاق اتصال قاعدة البيانات.
يتم استخدام كائنات المعاملات لإدارة وتنفيذ عمليات قاعدة البيانات المختلفة. يمكن أن تقوم بتشغيل وتوصيلات قاعدة البيانات وإغلاقها ، وتنفيذ عبارات SQL ، وعمليات الخطأ المتدلية.
يحتوي Redis لدينا أيضًا على كائنات لإدارة المعاملات ، والتي تقع تحت redis.clients.jedis.transaction.
الكود ذي الصلة لمعاملات Jedis:
حزمة cn.com.redis ؛ استيراد redis.clients.jedis.jedis ؛ استيراد redis.clients.jedis.transaction ؛ اختبار الفئة العامة 7 {public static void main (string [] args) {Jedis Jedis = New Jedis ("192.168.248.129" ، 6379) ؛ معاملة المعاملة = jedis.multi () ؛ // إرجاع كائن التحكم في المعاملة // قبل التحميل العملية المراد تنفيذه في كائن المعاملة مسبقًا المعاملة ("K4" ، "V4") ؛ Transaction.set ("K5" ، "V5") ؛ Transaction.exec () ؛ // execute}}دعنا نتحقق من redis:
وجدت أنه تمت إضافة البيانات
نقوم بتغيير قيمة K4 وقيمة K5 إلى "V44" و "V55" ، ثم إضافة بيان المعاملة.
حزمة cn.com.redis ؛ استيراد redis.clients.jedis.jedis ؛ استيراد redis.clients.jedis.transaction ؛ اختبار الفئة العامة 7 {public static void main (string [] args) {Jedis Jedis = New Jedis ("192.168.248.129" ، 6379) ؛ معاملة المعاملة = jedis.multi () ؛ // إرجاع كائن التحكم في المعاملة // قبل التحميل العملية المراد تنفيذه في كائن المعاملة مسبقًا المعاملة ("k4" ، "v44") ؛ Transaction.set ("K5" ، "V55") ؛ Transaction.Discard () ؛ // Rolling Back}}ستجد أن عملية إدخال البيانات قد تم ترحيلها ، ولم يتم تغيير القيمتين في redis:
نقوم بمحاكاة معاملة تمرد بطاقة ائتمان مرة واحدة ، باستخدام معاملات redis للتعامل مع بعض المنطق:
حزمة cn.com.redis ؛ استيراد redis.clients.jedis.jedis ؛ استيراد redis.clients.jedis.transaction ؛ الفئة العامة TestTransaction {// محاكاة استهلاك بطاقة الائتمان وسداد الفراغ الثابت العام (سلسلة [] args) {testTransaction t = new testTransaction () ؛ Retvalue Boolean = T.TransMethod (100) ؛ if (Retvalue) {system.out.println ("الاستخدام الناجح لاستهلاك بطاقة الائتمان!") ؛ } آخر {system.out.println ("فشل في استخدام استهلاك بطاقة الائتمان!") ؛ }} /*** بشروط Layman ، فإن أمر الساعة هو وضع علامة على المفتاح. إذا تم وضع علامة على المفتاح ، * إذا تم تعديل المفتاح من قبل شخص آخر قبل تقديم المعاملة ، فسوف تفشل المعاملة. يمكن عادةً تجربة هذا الموقف مرة أخرى في البرنامج*. * * أولاً ، علامة التوازن ، ثم تحقق مما إذا كان الرصيد كافياً. إذا كانت غير كافية ، قم بإلغاء العلامة دون خصم ؛ * إذا كانت كافية ، ابدأ المعاملة في عملية التحديث. * إذا تم تعديل توازن المفتاح من قبل الآخرين خلال هذه الفترة ، فسيتم الإبلاغ عن خطأ عند إرسال المعاملة (EXEC). * يمكن عادةً اكتشاف هذا النوع من الخطأ في البرنامج ثم يتم تنفيذه مرة أخرى حتى ينجح. * */ private boolean transmethod (int int) {system.out.println ("يمكنك استخدام بطاقة الائتمان لتعزيز الدفعة"+المبلغ+"Yuan") ؛ Jedis Jedis = New Jedis ("192.168.248.129" ، 6379) ؛ رصيد int = 1000 ؛ // الرصيد المتاح int debt ؛ // خارج int amttosubtract = المبلغ ؛ // مبلغ تنظيف حقيقي jedis.set ("الرصيد" ، string.valueof (الرصيد)) ؛ Jedis.Watch ("التوازن") ؛ //jedis.set("balance "،" 1100 ") ؛ // يجب ألا تظهر هذه الجملة. من أجل محاكاة البرامج الأخرى ، تم تعديل الإدخال. التوازن = integer.parseint (jedis.get ("التوازن")) ؛ if (الرصيد <amttosubtract) {// الرصيد المتاح أقل من المبلغ الفعلي المصقول ، يتم رفض المعاملة jedis.unwatch () ؛ System.out.println ("الرصيد المتاح غير كافٍ!") ؛ العودة كاذبة } آخر {// عندما يكون الرصيد المتاح كافيًا ، ثم قم بتنفيذ نظام الاستنتاج. معاملة المعاملة = jedis.multi () ؛ Transaction.decrby ("الرصيد" ، amttosubtract) ؛ // الرصيد ناقص مبلغ المال في amttosubtract Transaction.incrby ("Debt" ، amttosubtract) ؛ // يزيد ديون بطاقة الائتمان من المال في AMTTOSubtract Transactaction.exec () debt = integer.parseint (jedis.get ("debt")) ؛ system.out.println ("نهاية تنفيذ معاملة المعاملة الديون ...") ؛ System.out.println ("رصيدك المتاح:"+التوازن) ؛ System.out.println ("أنت مدين حاليًا بالمال:"+ديون) ؛ العودة صحيح. }}}يحاكي هذا الرمز المستخدم الذي استخدم بطاقة ائتمان لتمرير 100 يوان. في هذا الوقت ، يجب تخفيض الرصيد المتاح لبطاقة الائتمان بمقدار 100 يوان ، ويجب زيادة ديون 100 يوان.
نتائج التشغيل:
نتائج Redis:
إثبات أن عملنا كانت ناجحة.
تتم إضافة أمر المراقبة لمنع العمليات الأخرى من مقاطعة المعاملات أو التأثير على نتائج حساب المعاملة أثناء تنفيذ المعاملات ، مما يؤدي إلى مواقف غير طبيعية مثل "قراءة الوهم" و "البيانات القذرة". يخلق أمر الساعة مفتاحًا. بمجرد العثور على أنه تم تعديل المفتاح من قبل شخص آخر أثناء التنفيذ ، ستفشل المعاملة. يمكن عادةً اكتشاف هذا النوع من الخطأ في البرنامج ثم ينفذ مرة أخرى حتى ينجح. لذلك ، يمكن لأمر المراقبة ضمان مزامنة البيانات.
لإثبات الغرض من أمر الساعة ، نطلق سراح Jedis.set ("التوازن" ، "1100") ؛ التعليق في الكود أعلاه ، ثم طريقة transmethod ترمي الاستثناء المقاطع: رميات interruptedException ، فإن الطريقة الرئيسية تلتقط الاستثناء المقاطع ، ثم يبرز صندوق تحذير مماثل.
حزمة cn.com.redis ؛ استيراد java.util.list ؛ استيراد redis.clients.jedis.jedis ؛ استيراد redis.clients.jedis.transaction ؛ الفئة العامة TestTransaction {// محاكاة استهلاك بطاقة الائتمان وسداد الفراغ الثابت العام (سلسلة [] args) {testTransaction t = new testTransaction () ؛ القيمة المنطقية Retvalue = false ؛ المنقطع المنطقي = خطأ ؛ حاول {Retvalue = t.transmethod (100) ؛ } catch (interruptedException e) {interrupt = true ؛ System.out.println ("تم مقاطعة المعاملة ، يرجى التنفيذ مرة أخرى!") ؛ } أخيرًا {if (retvalue) {system.out.println ("الاستخدام الناجح لبطاقة الائتمان!") ؛ } آخر {if (! مقاطع) {system.out.println ("فشل في استخدام بطاقة الائتمان! الرصيد غير الكافي!") ؛ }}}}} /*** بعبارات بسيطة ، فإن أمر الساعة هو وضع علامة على المفتاح. إذا تم وضع علامة على المفتاح ، * إذا تم تعديل المفتاح من قبل شخص آخر قبل تقديم المعاملة ، فسوف تفشل المعاملة. يمكن عادةً تجربة هذا الموقف مرة أخرى في البرنامج*. * * أولاً ، علامة التوازن ، ثم تحقق مما إذا كان الرصيد كافياً. إذا كانت غير كافية ، قم بإلغاء العلامة دون خصم ؛ * إذا كانت كافية ، ابدأ المعاملة في عملية التحديث. * إذا تم تعديل توازن المفتاح من قبل الآخرين خلال هذه الفترة ، فسيتم الإبلاغ عن خطأ عند إرسال المعاملة (EXEC). * يمكن عادةً اكتشاف هذا النوع من الخطأ في البرنامج ثم يتم تنفيذه مرة أخرى حتى ينجح. * */ private boolean transmethod (int int) يلقي interruptedException {system.out.println ("يمكنك استخدام بطاقة الائتمان الخاصة بك لتقديم الدفعة"+المبلغ+"Yuan") ؛ Jedis Jedis = New Jedis ("192.168.248.129" ، 6379) ؛ رصيد int = 1000 ؛ // الرصيد المتاح int ؛ // المبلغ المطلق int amttosubtrict = المبلغ ؛ // حدود الفرشاة الحقيقية jedis.set ("الرصيد" ، string.valueof (التوازن)) ؛ Jedis.Watch ("التوازن") ؛ Jedis.set ("التوازن" ، "1100") ؛ // لا ينبغي أن تظهر هذه الجملة. من أجل محاكاة البرامج الأخرى ، تم تعديل الإدخال. التوازن = integer.parseint (jedis.get ("التوازن")) ؛ if (الرصيد <amttosubtract) {// الرصيد المتاح أقل من المبلغ الفعلي المصقول ، يتم رفض المعاملة jedis.unwatch () ؛ System.out.println ("الرصيد المتاح غير كافٍ!") ؛ العودة كاذبة } آخر {// عندما يكون الرصيد المتاح كافيًا ، ثم قم بتنفيذ نظام الاستنتاج. معاملة المعاملة = jedis.multi () ؛ Transaction.decrby ("الرصيد" ، amttosubtract) ؛ // الرصيد ناقص أموال Amttosubtract Transaction.incrby ("Debt" ، amttosubtract) ؛ // يزيد ديون بطاقة الائتمان من أموال AMTTOSUBTRIN تم تعديله أثناء التنفيذ. رمي جديد interruptedException () ؛ } آخر {// تقديم المعاملة الناجح توازن = integer.parseint (jedis.get ("التوازن")) ؛ debt = integer.parseint (jedis.get ("debt")) ؛ System.out.println ("CRUPUCT ENTRAMENT ENDING ...") ؛ System.out.println ("رصيدك المتاح:"+التوازن) ؛ System.out.println ("أنت مدين حاليًا بالمال:"+ديون) ؛ العودة صحيح. }}}}}قم بتشغيله مرة أخرى وشاهد التأثير:
يوضح هذا أنه إذا تم تعديل البيانات بعد تنفيذ أمر المراقبة وقبل تقديم المعاملة ، فلن يكون تنفيذ المعاملة ناجحًا ، مما يضمن أمان البيانات.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.