بن بست (Deadlock) در اوراکل
بن بست (DEADLOCK) در Oracle:
-
بن بست هنگامی رخ می دهد که دو یا چند Sessions (جلسه) منتظر اطلاعات قفل شده توسط یکدیگر باشند و در نتیجه مسدود می شود.
-
شما صبر می کنید ، شما مسدود شده اید. شما در حال تلاش برای تغییر برخی از داده هایی هستید که Session (جلسه) دیگر در حال تغییر است.
-
شما “ردیف X” را قفل کرده اید. آنها “ردیف y” را قفل کردند. شما باید “ردیف y” را قفل کنید ، آنها را مسدود می کنید. اکنون آنها باید “ردیف x” را قفل کنند. آنها توسط شما مسدود می شوند. شما اکنون به بن بست رسیده اید – منتظر هرکدام هستید. ما یکی از اظهارات را خاتمه می دهیم (دیگری شما و آنها فقط در آنجا برای همیشه منتظر یکدیگر می نشینیم).
آن Session (جلسه) تصمیم می گیرد که آیا باید:
a) commit
b) rollback
c) do something else
-
یکی از عوامل بوجود آمدن Deadlock در اوراکل به خاطر طراحی ضعیف دیتابیس و همچنین کد نویسی ضعیف در سطح اپلیکیشن می باشد که می توان با همکاری DBA با تیم Developer از بوجود آمدن اینگونه مسائل جلوگیری کرد.
-
بعضی اوقات بخاطر پروسس های هست که بصورت batch در اوراکل اجرا می شود و زمان زیادی طول میکشد و یا با هم Overlap-همپوشانی دارند و همچنین تعداد session های زیاد که بر روی یک سطر از جدول در حال عملیات هستند موجب Deadlock می شود.
-
یکی از ساده ترین راه ها این است که یوزرهایی که باعث lock شدن در اوراکل می شوند را پیدا کرده و سپس kill کنید.
پیشگیری:
-
یکی از آنها Tune کردن اپلیکیشن می باشد. بصورتی که از روش optimistic برای DML استفاده نمایید.
-
در بعضی شرایط بحرانی اضافه کردن مقدار INITRANS بر روی جداول و ایندکس های که بیشترین استفاده را در اوراکل دارند تاثیر گذار خواهد بود.
-
از block size های کوچکتر در Oracle استفاده نمایید مثلا db2k_cache_size و این پست را مشاهده کنید.
-
همیشه برای foreign keys ایندکس در اوراکل بسازید.
-
برای تشخیص Deadlock از $ORACLE_HOME/rdbms/admin/dbmslock.sql. استفاده کنید. بهتر است که قبل از وقوع آن همیشه اسکریپت مانیتورینگ Deadlock را در زمانهای مختلف اجرا کنید.
-
یک ابزار هم هست به نام Oracle Solaris Studio Thread Analyzer برای پیدا کردن Deadlock در برنامه ها.