با استفاده از معاملات

ساخت وبلاگ

مواقعی وجود دارد که شما نمی خواهید یک جمله اجرا شود مگر اینکه یکی دیگر از آنها تکمیل شود. به عنوان مثال ، هنگامی که صاحب شکستن قهوه میزان قهوه فروخته شده در هر هفته را به روز می کند ، مالک نیز می خواهد کل مبلغ فروخته شده تا به امروز را به روز کند. با این حال ، مبلغ فروخته شده در هفته و کل مبلغ فروخته شده باید همزمان به روز شود. در غیر این صورت ، داده ها متناقض خواهند بود. روش اطمینان از اینکه هر دو عمل رخ می دهد یا هیچ اقدامی رخ نمی دهد استفاده از معامله است. معامله مجموعه ای از یک یا چند بیانیه است که به عنوان یک واحد اجرا می شود ، بنابراین یا همه اظهارات اجرا می شوند ، یا هیچ یک از اظهارات اجرا نمی شود.

این صفحه موضوعات زیر را در بر می گیرد

غیرفعال کردن حالت تعهد خودکار

هنگامی که اتصال ایجاد می شود ، در حالت حقوقی خودکار قرار دارد. این بدان معنی است که هر بیانیه SQL جداگانه به عنوان معامله رفتار می شود و درست پس از اجرای آن به طور خودکار انجام می شود.(به طور دقیق تر ، پیش فرض این است که بیانیه SQL هنگام اتمام انجام شود ، نه وقتی اجرا شد. بیانیه ای به پایان می رسد که تمام مجموعه های نتیجه و تعداد به روزرسانی آن بازیابی شده است. تقریباً در همه موارد ، با این حال ، با این حال ، تقریباً در همه موارد، بیانیه ای به اتمام رسیده و بنابراین متعهد شده است ، درست پس از اجرای آن.)

راه اجازه گروه بندی دو یا چند بیانیه در یک معامله ، غیرفعال کردن حالت حق بیمه خودکار است. این در کد زیر نشان داده شده است ، جایی که Con یک اتصال فعال است:

انجام معاملات

پس از غیرفعال شدن حالت کمپارچه خودکار ، هیچ بیانیه SQL مرتکب نشده است تا زمانی که شما به صراحت این روش را مرتکب نشوید. کلیه اظهارات اجرا شده پس از تماس قبلی به روش متعهد در معامله فعلی گنجانده شده و به عنوان واحد با هم متعهد می شوند. روش زیر ، coffeestable. updatecoffeesales ، که در آن یک اتصال فعال است ، یک معامله را نشان می دهد:

در این روش ، حالت حقوقی خودکار برای اتصال اتصال غیرفعال است ، به این معنی که دو به روزرسانی های آماده شده و به روزرسانی در هنگام فراخوانی روش متعهد ، با هم متعهد می شوند. هر زمان که روش تعهد فراخوانی شود (یا به طور خودکار وقتی حالت حقوقی خودکار فعال می شود یا صریحاً هنگام غیرفعال بودن) ، تمام تغییرات ناشی از اظهارات موجود در معامله دائمی انجام می شود. در این حالت ، این بدان معناست که فروش و کل ستون های قهوه کلمبیا به 50 تغییر یافته است (اگر قبلاً 0 نفر 0 بوده است) و تا زمانی که با یک بیانیه به روزرسانی دیگر تغییر پیدا کنند ، این مقدار را حفظ می کنند.

بیانیه con. setAutoCommit (درست) ؛حالت کاملی خودکار را فعال می کند ، به این معنی که هر بیانیه در هنگام اتمام بار دیگر به طور خودکار انجام می شود. سپس ، شما به حالت پیش فرض بازگشتید که لازم نیست این روش را تعهد کنید. توصیه می شود فقط در حالت معاملات حالت ارتباطی خودکار را غیرفعال کنید. به این ترتیب ، شما از نگه داشتن قفل های پایگاه داده برای اظهارات متعدد خودداری می کنید ، که احتمال درگیری با سایر کاربران را افزایش می دهد.

استفاده از معاملات برای حفظ یکپارچگی داده

علاوه بر گروه بندی اظهارات با هم برای اجرای به عنوان واحد ، معاملات می توانند به حفظ یکپارچگی داده ها در یک جدول کمک کنند. به عنوان مثال ، تصور کنید که یک کارمند قرار بود قیمت قهوه جدید را در قهوه های میز وارد کند اما این کار را برای چند روز به تأخیر انداخت. در این میان ، قیمت ها افزایش یافت و امروز مالک در حال ورود به قیمت های بالاتر است. سرانجام کارمند در همان زمان که مالک در تلاش است تا جدول را به روز کند ، وارد قیمت های منسوخ شده می شود. پس از درج قیمت های منسوخ ، کارمند متوجه می شود که آنها دیگر معتبر نیستند و روش اتصال را بازپرداخت می کند تا اثرات آنها را خنثی کند.. در این شرایط ، این امکان وجود دارد که مالک قیمتی را که به ارزش قبلی خود بازگردانده شده است ، چاپ کند و قیمت چاپ شده را نادرست کند.

با استفاده از معاملات ، می توان از این نوع وضعیت جلوگیری کرد ، و در برابر درگیری هایی که در هنگام دسترسی به داده ها به طور همزمان به داده ها دسترسی پیدا می کنند ، می توان از سطح محافظت در برابر درگیری هایی که بوجود می آیند ، جلوگیری شود.

برای جلوگیری از درگیری در طی معامله ، DBMS از قفل ها ، مکانیسم هایی برای مسدود کردن دسترسی دیگران به داده هایی که توسط معامله قابل دسترسی هستند استفاده می کند.(توجه داشته باشید که در حالت کمپرسی خودکار ، جایی که هر بیانیه معامله است ، قفل ها فقط برای یک بیانیه برگزار می شوند.) پس از تنظیم قفل ، تا زمانی که معامله انجام شود یا به عقب برگردانده شود ، در حال اجرا است. به عنوان مثال ، یک DBMS می تواند یک ردیف یک جدول را قفل کند تا به روزرسانی های آن انجام شود. تأثیر این قفل برای جلوگیری از خواندن کثیف کاربر ، یعنی خواندن یک مقدار قبل از دائمی است.(دسترسی به یک مقدار به روز شده که مرتکب نشده است ، خواندن کثیف در نظر گرفته می شود زیرا امکان پذیر است که این مقدار به مقدار قبلی خود برگردد. اگر مقداری را بخوانید که بعداً به عقب برگردد ، یک مقدار نامعتبر را خوانده اید.)

نحوه تنظیم قفل ها توسط آنچه که سطح جداسازی معامله نامیده می شود ، تعیین می شود ، که می تواند از عدم پشتیبانی از معاملات به هیچ وجه تا پشتیبانی از معاملات که قوانین دسترسی بسیار دقیق را اجرا می کنند ، باشد.

یک نمونه از سطح جداسازی معامله ، Transact_Read_Committed است که اجازه نمی دهد تا پس از انجام آن به یک مقدار دسترسی پیدا شود. به عبارت دیگر ، اگر سطح جداسازی معامله روی Transaction_Read_Committed تنظیم شود ، DBMS اجازه نمی دهد که خواندن های کثیف رخ دهد. اتصال رابط شامل پنج مقدار است که نشان دهنده سطح جداسازی معامله است که می توانید در JDBC استفاده کنید:

 

میزان انزوا معاملات خواندن کثیف خواندن غیر قابل تکرار فانتوم می خواند
معامله_ پشتیبانی نشده قابل اجرا نیست قابل اجرا نیست قابل اجرا نیست
Transaction_Read_Commited پشتیبانی مانع مجاز مجاز
Transaction_Read_Uncommed پشتیبانی مجاز مجاز مجاز
Transaction_Repeatable_Read پشتیبانی مانع مانع مجاز
Transaction_Serializable پشتیبانی مانع مانع مانع

خواندن غیر قابل تکرار هنگامی اتفاق می افتد که معامله A یک ردیف را بازیابی کند ، معامله B متعاقباً ردیف را به روز می کند و معامله بعداً همان ردیف را بازیابی می کند. معاملات A دو ردیف را دو بار بازیابی می کند اما داده های مختلفی را می بیند.

خواندن فانتوم هنگامی اتفاق می افتد که معامله ، مجموعه ای از ردیف ها را که یک شرط معین را برآورده می کند ، بازیابی می کند ، معامله B متعاقباً یک ردیف را وارد می کند یا به روز می کند به طوری که اکنون ردیف در معامله A مطابقت دارد و معامله بعداً بازیابی مشروط را تکرار می کند. معامله A در حال حاضر یک ردیف اضافی مشاهده می کند. این ردیف به عنوان یک فانتوم گفته می شود.

معمولاً نیازی به انجام کاری در مورد سطح جداسازی معامله ندارید. فقط می توانید از DBMS خود از پیش فرض استفاده کنید. سطح جداسازی معاملات پیش فرض به DBMS شما بستگی دارد. به عنوان مثال ، برای Java DB ، Transaction_read_commited است. JDBC به شما امکان می دهد تا دریابید که DBMS شما در چه سطح جداسازی معامله تنظیم شده است (با استفاده از روش اتصال getTransactionIsolation) و همچنین به شما امکان می دهد تا آن را در سطح دیگری تنظیم کنید (با استفاده از روش اتصال setTransactionIsolation).

توجه: یک راننده JDBC ممکن است از تمام سطوح جداسازی معامله پشتیبانی نکند. اگر راننده از سطح جداسازی مشخص شده در فراخوانی از setTransactionIsolation پشتیبانی نکند ، راننده می تواند سطح جداسازی معامله بالاتر و محدودتر را جایگزین کند. اگر راننده نتواند سطح معامله بالاتری را جایگزین کند ، یک SQLEXception را پرتاب می کند. برای تعیین اینکه آیا راننده از یک سطح معین پشتیبانی می کند ، از Databasemetadata. supportStransactionIsolationLevel استفاده کنید.

تنظیم و بازگشت به SavePoints

Method Coection. SetSavePoint ، یک شیء SavePoint را در معامله فعلی تنظیم می کند. روش Coection. Rollback برای استفاده از یک آرگومان SavePoint بیش از حد بارگذاری شده است.

روش زیر ، coffeestable. modifypricesbypercentage ، قیمت یک قهوه خاص را با درصدی درصدی ، pricemodifier افزایش می دهد. با این حال ، اگر قیمت جدید از قیمت مشخص شده ، حداکثر قیمت باشد ، قیمت آن به قیمت اصلی برگردانده می شود:

بیانیه زیر مشخص می کند که مکان نما از شیء نتیجه حاصل از پرس و جو GetPrice هنگام فراخوانی روش تعهد بسته می شود. توجه داشته باشید که اگر DBMS شما از resultset. close_cursors_at_commit پشتیبانی نمی کند ، پس از این ثابت نادیده گرفته می شود:

این روش با ایجاد SavePoint با عبارت زیر آغاز می شود:

این روش بررسی می کند که آیا قیمت جدید از مقدار حداکثر قیمت بیشتر است یا خیر. اگر چنین است ، روش با بیانیه زیر معامله را بازگرداند:

در نتیجه ، هنگامی که این روش با فراخوانی روش اتصال.commit ، معامله را مرتکب می شود ، هیچ ردیفی را مرتکب نمی شود که SavePoint مرتبط با آن به عقب برگردانده شود. این همه ردیف های به روز شده دیگر را مرتکب می شود.

انتشار SavePoints

Method Coection. ReleasesAvePoint یک شیء SavePoint را به عنوان یک پارامتر می گیرد و آن را از معامله فعلی حذف می کند.

پس از انتشار SavePoint ، تلاش برای ارجاع آن در یک عملیات برگشت ، باعث می شود که یک SQLException پرتاب شود. هرگونه SavePoints که در یک معامله ایجاد شده است به طور خودکار آزاد می شوند و هنگام انجام معامله ، یا هنگامی که کل معامله به عقب برگردانده می شود ، نامعتبر می شوند. چرخاندن معامله به یک SavePoint به طور خودکار آزاد می شود و باعث می شود سایر نقاط ذخیره دیگری که پس از SavePoint مورد نظر ایجاد شده است ، نامعتبر باشد.

چه موقع تماس بگیرید روش برگشت

همانطور که قبلاً ذکر شد ، فراخوانی روش برگشت ، معامله را خاتمه می دهد و مقادیری را که به مقادیر قبلی آنها تغییر یافته است ، باز می گرداند. اگر می خواهید یک یا چند بیانیه را در یک معامله اجرا کنید و یک SQLEXCEATION دریافت کنید ، برای پایان دادن به معامله با روش برگشت با روش تماس بگیرید و دوباره معامله را شروع کنید. این تنها راه برای دانستن آنچه انجام شده و چه کاری انجام نشده است. گرفتن یک sqlexception به شما می گوید که چیزی اشتباه است ، اما به شما نمی گوید چه چیزی بوده یا متعهد نیست. از آنجا که شما نمی توانید به این واقعیت توجه کنید که هیچ کاری انجام نشده است ، فراخوانی روش بازگشت تنها راه برای اطمینان است.

روش coffeestable. updatecoffeesales یک معامله را نشان می دهد و شامل یک بلوک صید است که از روش برگشت روش استفاده می کند. اگر برنامه ادامه یابد و از نتایج معامله استفاده کند ، این تماس به روش بازگشت در بلوک Catch از استفاده از داده های احتمالاً نادرست جلوگیری می کند.

التداول المالي...
ما را در سایت التداول المالي دنبال می کنید

برچسب : نویسنده : سیروس ابراهیم‌زاده بازدید : <-PostHit-> تاريخ : چهارشنبه 2 فروردين 1402 ساعت: 12:13