مقدمة
عنوان تنزيل رمز نموذج لهذه المقالة (تشغيل بالكامل ، بما في ذلك ملفات SQL ، يرجى تعديل تكوين قاعدة البيانات بعد التنزيل): انقر هنا للتنزيل
يتم التحكم في العديد من عمليات قاعدة البيانات ككل ، وهي تنجح أو تفشل معًا.
Atomicity: يشير إلى أن المعاملة هي وحدة عمل لا ينفصلان ، والعمليات في معاملة إما تحدث أو لا تحدث.
الاتساق: يعني أن سلامة البيانات قبل وبعد المعاملة يجب أن تكون متسقة.
العزلة: عندما يصل العديد من المستخدمين إلى قاعدة البيانات بشكل متزامن ، لا يمكن التداخل مع معاملات المستخدمين من خلال معاملات المستخدمين الآخرين ، ويجب عزل البيانات بين المعاملات المتزامنة المتعددة عن بعضها البعض.
الثبات: بمجرد ارتكاب المعاملة ، تكون تغييراتها في البيانات في قاعدة البيانات دائمة ، ولا ينبغي أن يكون لفشل قاعدة البيانات الفورية أي تأثير عليها.
-Platform TransactionManager Manager (Commit ، Fladback Transactions)
يوفر Spring تطبيقات واجهة TransactionManager المختلفة منصة لأطراف الثبات المختلفة. يحب:
باستخدام DataSourCeTransActionManager عند استمرار البيانات باستخدام SPRING JDBC أو IBATIS
استخدم HibernatetransactionManager عند استخدام Hibernate3.0 للبيانات المستمرة
-معلومات تعريف معاملة المعاملة (العزلة ، الانتشار ، المهلة ، القراءة فقط)
القراءة القذرة: تقرأ معاملة واحدة من البيانات التي أعيد كتابتها بواسطة معاملة أخرى ولكن لم يتم تقديمها بعد. إذا تم ترحيل هذه البيانات ، فإن بيانات القراءة غير صالحة.
لا توجد قراءة متكررة: في نفس المعاملة ، تختلف النتائج التي يتم إرجاعها عن طريق قراءة نفس البيانات عدة مرات.
قراءة الخيال: بعد أن تقرأ معاملة واحدة عدة أسطر من السجلات ، تقوم معاملة أخرى بإدراج بعض السجلات ، وتحدث قراءة الخيال. في الاستعلام اللاحق ، ستجد المعاملة الأولى بعض السجلات التي لم تكن متوفرة في الأصل.
مستوى عزل المعاملة: (خمسة أنواع)
من بينها ، يستخدم MySQL مستوى العزل المتكرر بشكل افتراضي ؛ يستخدم Oracle مستوى العزل Read_Commited افتراضيًا
سلوك اتصال المعاملات: (سبعة أنواع)
-المعاملة المعاملة المعاملة المحددة
أ. إدارة معاملات البرمجة (استنادًا إلى التحكم في برمجة Java ، نادرًا ما تستخدم)-انظر الحزمة Demo1
استخدم TransactionTemplate لتغليف عمليات DAO المتعددة
*ب. إدارة المعاملات التعريفية (التحكم في تكوين AOP المستند إلى الربيع)
- استنادا إلى المعاملة Proxyfactorybean. (نادرًا ما تستخدم)-انظر الحزمة Demo2
من الضروري تكوين TransactionProxyFactoryBean لكل فئة تخضع لإدارة المعاملات للتعزيز.
-استنادا إلى تكوين XML (يستخدم بشكل متكرر) -SE DEMO3 حزمة
بمجرد تكوينه ، لا يحتاج أي شيء إلى إضافته إلى الفصل.
إذا كان الإجراء كائنًا مستهدفًا لإدخال المعاملة ، فأنت بحاجة إلى إضافة سمة الوكيل الهدف = "TRUE" إلى عنصر <aOP: config>. والسبب هو إبلاغ إطار الربيع باستخدام تقنية CGLIB لإنشاء فئات العمل مع وظائف إدارة المعاملات.
استنادا إلى التعليقات التوضيحية (التكوين البسيط ، غالبًا ما يستخدم)-رؤية حزمة Demo4
تمكين تكوين شرح المعاملة في ApplicationContext.xml. (في ApplicationContext.xml ، فقط حدد الفول وإلحاق العناصر التالية)
<bean id = "txmanager"> <property name = "SessionFactory"> </prereent> <tx: معاملة المعاملة التي تعتمد على التعليقات التوضيحية = "txmanager"/>
استخدم transactional في فئة المكون المستهدف ، والتي يمكن تعريفها قبل الفصل أو قبل الطريقة.
--برمجة
/ *** description: واجهة طبقة DAO لحالة التحويل**/ الواجهة العامة accountdao {/ *** param out*: حساب التحويل* param money*: تحويل المبلغ*/ public void outmoney (string out ، double money) ؛ / ** * * param in *: حساب التحويل * param money *: تحويل المبلغ */ public void inmoney (سلسلة في ، نقود مزدوجة) ؛ } / *** description: فئة تنفيذ طبقة DAO لحالة التحويل*/ accountdaoimpl من الفئة العامة يمتد JDBCDAOSUPPORT على حساب accountdao {/ *** @param out*: transfer account* @param money*: ordertride public void outmoney (string out ، double money) {string sql = this.getjdbctemplate (). Update (SQL ، Money ، Out) ؛ } / *** param in*: حساب التحويل* param money*: مبلغ التحويل* / Override public void inmoney (سلسلة في ، نقود مزدوجة) {String sql = "تحديث حساب Money = money+؟ أين الاسم =؟" ؛ this.getjdbctemplate (). update (sql ، money ، in) ؛ }} / *** description: واجهة الأعمال لحالة التحويل**/ واجهة عامة الحسابات {/ *** param out: Tension Out* param in: transfer account* param money: transfer transfer*/ public void transfer (string out ، string in ، double money) ؛ } / *** description: فئة تنفيذ طبقة الأعمال لحالة النقل*/ حسابات الفئة العامة تنفذ حساب الحسابات {// dao private accountdao accountdao ؛ // قالب لحقن معاملات المعاملات الخاصة معاملة المعاملة ؛ / ** * param out *: Tension Out * param in *: حساب التحويل * Param Money *: تحويل المبلغ */ Override Public Void Transfer (السلسلة النهائية ، السلسلة النهائية ، الأموال المزدوجة النهائية) {// إذا حدث استثناء أثناء العملية ، يمكن إكمال العملية السابقة. إذا لم يستطع الأخير ، فإن النقل ناجح ولكن لم يتم استلام النقل. // accountdao.outmoney (Out ، Money) ؛ // int i = 1/0 ؛ // accountdao.inmoney (in ، money) ؛ TransactionTemplate.execute (New TransactionCallbackWithoutResult () {Override محمية void doIntransactionWithoutResult (TransactionStatus TransactionStatus) {accountdao.outmoney (out ، mone) ؛ accountdao.inmoney (في ، المال) ؛ } public void setAccountDao (accountdao accountdao) {this.accountdao = accountDao ؛ } public void setTransActionTemplate (TransactionTemplate TransactionTemplate) {this.transactionTemplate = TransactionTemplate ؛ }}ApplicationContext1.xml
<!-تقديم ملفات الخصائص الخارجية-> <السياق: property-placeholder location = "classpath: jdbc.properties" /> <!-تكوين C3P0 Connection Pool-> <bean id = "dataSource"> <property name = "driverClass" value = "$ {jdbc.driverclass}" /> <property name = "user" value = "$ {jdbc.username}" /> <property name = "password" value = "$ {jdbc.password}" /> </bean> <!-تكوين فئة طبقة الأعمال-> <bean id = "accountservice"> <property name = "accountdao" ref = accountda name = "TransactionTemplate" ref = "TransactionTemplate" /> </bean> <!-تكوين فئة DAO (مبسطة ، سيتم تكوين JDBCTEMPLATE تلقائيًا)-> <bean id = "accountdao"> <property name = "datasource" ref = "datasource" /> < /bean> id = "jdbctemplate"> <property name = "dataSource" ref = "datasource" /> </bean> <bean id = "accountdao"> <property name = "jdbctemplate" ref = "jdbctemplate" />-> <!- ============================================================================================================================================================================= =================================================================================================================================================================== =================================================================================================================================================================== =================================================================================================================================================================== تكوين قالب إدارة المعاملات: الفئات التي توفرها الربيع لتبسيط رمز إدارة المعاملات -> <bean id = "TransactionTemplate"> <property name = "TransactionManager" ref = "TransactionManager"/> </bean>امتحان:
Runwith (SpringJunit4ClassRunner.Class) ContextConfiguration ("ClassPath: ApplicationContext1.xml") الفئة العامة TransactionTest {resource (name = "accountService") حساب الحسابات الخاصة ؛ test public void demo1 () {accountService.transfer ("AAA" ، "BBB" ، 200d) ؛ }}-طريقة تعتمد على المعاملات proxyfactorybean
حسابات الفئة العامة تنفذ حساب الحسابات {// dao private accountdao accountdao ؛ / ** * param out *: Tension Out * param in *: stranse account * param money *: transfer transe */ override public void transfer (string out ، string in ، double money) {accountdao.outmoney (out ، money) ؛ // int i = 1/0 ؛ accountdao.inmoney (في ، المال) ؛ } public void setAccountDao (accountdao accountdao) {this.accountdao = accountDao ؛ }}ApplicationContext2.xml
<!-تقديم ملفات الخصائص الخارجية-> <السياق: property-placeholder location = "classpath: jdbc.properties" /> <!-تكوين C3P0 Connection Pool-> <bean id = "dataSource"> <property name = "driverClass" value = "$ {jdbc.driverclass}" /> <property name = "user" value = "$ {jdbc.username}" /> <property name = "password" value = "$ {jdbc.password}" /> </bean> <!-تكوين فئة طبقة الأعمال-> <bean id = "accountservice" jdbctemplate)-> <bean id = "accountdao"> <property name = "datasource" ref = "datasource" /> </bean> <!- ========================================================================================= ============================================================================================== ========================================================================================= ============================================================================================== -> <!-تكوين مدير المعاملات-> <bean id = "TransactionManager"> <property name = "dataSource" ref = "datasource" /> </bean> <!-تكوين الوكيل للطبقة التجارية-> <bean id = "accountserviceproxy"> <! name = "TransactionManager" ref = "TransactionManager"> </property> <!-حقن خصائص المعاملات-> <property name = "TransactionAttributes"> <props> <!-تنسيق الدعامة:* انتشار: استثناءات من المعاملات* أي استثناءات. <prop key = "transfer"> procfation_required </prop> <!-<prop key = "transfer"> spection_required ، readonly-> <!-<prop key = "transfer"> spection_required ، readonly </pr prات </property> </ban>امتحان:
RunWith (springJUnit4ClassRunner.Class) contextConfiguration ("classpath: applicationContext2.xml") المعاملة الفئة العامة { / *** تأكد من حقن فئة الوكيل: لأن الفئة proxy تنفذ تشغيلها* // resource (name = "accountservice") خدمة حساب الحسابات ؛ test public void demo1 () {accountService.transfer ("AAA" ، "BBB" ، 200d) ؛ }}-قائم على تكوين XML
حسابات الفئة العامة تنفذ حساب الحسابات {// dao private accountdao accountdao ؛ / ** * param out *: Tension Out * param in *: stranse account * param money *: transfer transe */ override public void transfer (string out ، string in ، double money) {accountdao.outmoney (out ، money) ؛ // int i = 1/0 ؛ accountdao.inmoney (في ، المال) ؛ } public void setAccountDao (accountdao accountdao) {this.accountdao = accountDao ؛ }}ApplicationContext3.xml
<!-تقديم ملفات الخصائص الخارجية-> <السياق: property-placeholder location = "classpath: jdbc.properties" /> <!-تكوين C3P0 Connection Pool-> <bean id = "dataSource"> <property name = "driverClass" value = "$ {jdbc.driverclass}" /> <property name = "user" value = "$ {jdbc.username}" /> <property name = "password" value = "$ {jdbc.password}" /> </bean> <!-تكوين فئة طبقة الأعمال-> <bean id = "accountservice" jdbctemplate)-> <bean id = "accountdao"> <property name = "datasource" ref = "datasource" /> </bean> <!- =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== =============================================================== : سلوك انتشار المعاملات العزلة: مستوى عزل المعاملات القراءة فقط: قارئ فقط التراجع عن العمل: ما هي الاستثناءات التي حدثت بدون رولف-ما هي الاستثناءات التي حدثت وليس مهلة التراجع: معلومات انتهاء الصلاحية-> <tx: configation = "التكوين> <aop: pointcut expression = "execution (* com.zs.spring.demo3.AccountService+.* (..))امتحان:
/ *** description: طريقة إدارة المعاملات التعريفية في الربيع الثاني: تكوين XML المستند إلى SideJ*/ runwith (SpringJunit4ClassRunner.class) contextConfiguration ("classPath: ApplicationConxt3 "حساب الحسابات") خدمة حساب الحسابات الخاصة ؛ test public void demo1 () {accountService.transfer ("AAA" ، "BBB" ، 200d) ؛ }}-قائم على التعليقات التوضيحية
/ *** @transactional الانتشار: سلوك انتشار المعاملات العزلة: مستوى عزل المعاملات قراءة فقط: القراءة فقط* rollbackfor: ما هي الاستثناءات التي حدثت orollbackfor: أي استثناءات لم تحدث عدم التراجع* rolbbackforclassname ، know.default ، readon application = chargetpl acpless. حساب الحساب {// DAO حقن التحويل الخاص حساب accountdao ؛ / *** param out*: حساب التحويل* param في*: حساب التحويل* param money*: تحويل المبلغ*/ Override public void transfer (string out ، string in ، double money) {accountDao.outMoney (out ، money) ؛ // int i = 1/0 ؛ accountdao.inmoney (في ، المال) ؛ } public void setAccountDao (accountdao accountdao) {this.accountdao = accountDao ؛ }}ApplicationContext4.xml
<!-تقديم ملفات الخصائص الخارجية-> <السياق: property-placeholder location = "classpath: jdbc.properties" /> <!-تكوين C3P0 Connection Pool-> <bean id = "dataSource"> <property name = "driverClass" value = "$ {jdbc.driverclass}" /> <property name = "user" value = "$ {jdbc.username}" /> <property name = "password" value = "$ {jdbc.password}" /> </bean> <!-تكوين فئة طبقة الأعمال-> <bean id = "accountservice" jdbctemplate)-> <bean id = "accountdao"> <property name = "datasource" ref = "datasource" /> </bean> <!- ========================================================================================= ============================================================================================== ========================================================================================= ============================================================================================== تكوين مدير المعاملات-> <bean id = "TransactionManager"> <property name = "datasource" ref = "datasource"/> </bean> <!-قم بتشغيل معاملة التعليقات التوضيحية-> <tx: المعاملة المعاملة المتعرجة = "المعاملة المعاملة"/>امتحان:
Runwith (springJunit4ClassRunner.Class) contextConfiguration ("classpath: applicationContext4.xml") المعاملة الفئة العامة { / *** تأكد من حقن فئة الوكيل: لأن فئة الوكيل تؤدي عمليات محسّنة* / @resource (name = "accountservice) private accountservice ؛ test public void demo1 () {accountService.transfer ("AAA" ، "BBB" ، 200d) ؛ }}للحصول على رمز محدد ومرجع ملف قاعدة البيانات الرمز الكامل:
http://xiazai.vevb.com/201805/yuanma/spring-transaction_jb51.rar
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.