ﻛﺎﻫﺶ ﻣﺸﻜﻼت درﮔﻴﺮى ﻗﻔﻞ ﻫﺎ در DB2
ﻳﻜﻰ از دﻏﺪﻏﻪ ﻫﺎی ﻣﻬﻢ ﻛﺎرﺑﺮان DB2، ﻛﻢ ﻛﺮدن ﻣﺸﻜﻼت ﻣﺮﺑﻮط ﺑﻪ ﻗﻔﻞ ﻫﺎ در DB2 ﻣﻰ ﺑﺎﺷﺪ.
زﻣﺎﻧﻰ ﻛﻪ ﺑﻪ ﻳﻚ Timeout ﺑﺮﺧﻮرد ﻣﻰ ﻛﻨﻴﺪ، ﺑﻪ اﻳﻦ ﻣﻌﻨﺎﺳﺖ ﻛﻪ ﺗﺮاﻛﻨﺶ دﻳﮕﺮی ﺑﺮ روی داده ای ﻛﻪ ﺷﻤﺎ ﻗﺼﺪ ﺗﻐﻴﻴﺮ آن را دارﻳﺪ، ﻗﻔﻞ ﮔﺬاری ﻛﺮده اﺳﺖ.
اﻳﻦ دﻟﻴﻠﻰ اﺳﺖ ﻛﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﺗﻼش ﻛﻨﻴﺪ ﻛﻪ ﻣﺪت زﻣﺎن ﻗﻔﻞ ﻫﺎﻳﻰ ﻛﻪ در ﺳﻴﺴﺘﻢ ﮔﺬاﺷﺘﻪ ﻣﻰ ﺷﻮﻧﺪ را ﻛﺎﻫﺶ دﻫﻴﺪ.
ﺑﺮای دﺳﺘﻴﺎﺑﻰ ﺑﻪ اﻳﻦ ﻫﺪف، ﭼﻨﺪﻳﻦ راه ﺣﻞ وﺟﻮد دارد، اﻣﺎ اﻛﺜﺮا ﻧﻴﺎز ﺑﻪ ﺗﻐﻴﻴﺮات ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻰ دارﻧﺪ.
برای مطالعه انواع قفل ها در DB2 اینجا کلیک کنید.
چه باید کرد؟
جهت کاهش مشکلات ﻗﻔﻞ ﻫﺎ در DB2، در اﺑﺘﺪا اﻃﻤﻴﻨﺎن ﺣﺎﺻﻞ ﻛﻨﻴﺪ ﻛﻪ ﻫﻤﻪ ی ﻓﺮاﻳﻨﺪﻫﺎی دﺳﺘﻪ ای ﺷﻤﺎ (Batch Processes) ﻣﺨﺼﻮﺻﺎ آﻧﻬﺎﻳﻰ ﻛﻪ در ﻳﻚ ﭼﺎرﭼﻮب زﻣﺎﻧﻰ اﻧﺠﺎم ﻣﻰ ﺷﻮﻧﺪ، ﻳﻚ اﺳﺘﺮاﺗﮋی Commit دارﻧﺪ.
اﻳﻦ ﺑﻪ اﻳﻦ ﻣﻌﻨﺎﺳﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎی ﺷﻤﺎ ﺑﺎﻳﺪ ﺑﻌﺪ از ﭘﺮدازش ﺗﻌﺪادی Insert، Update، Delete ﻳﻚ دﺳﺘﻮر Commit اﺟﺮا ﻛﻨﻨﺪ. دﺳﺘﻮر Commit ﺑﺎﻋﺚ ﻣﻰ ﺷﻮد ﺗﺎ DB2 ﺗﻐﻴﻴﺮات را داﺋﻤﻰ و ﻗﻔﻞ را آزاد ﻛﻨﺪ.
راه حل اول:
ﻳﻜﻰ از راه ﺣﻞ ﻫﺎی ﺧﻮب اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﺷﻤﺎرﻧﺪه ﺗﻌﺮﻳﻒ ﮔﺮدد ﻛﻪ ﺑﻌﺪ از ﻫﺮ ﺗﻐﻴﻴﺮی اﻓﺰاﻳﺶ ﻳﺎﺑﺪ. ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻰ ﺗﻮاﻧﻴﺪ ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ ﻛﻪ ﺑﻌﺪ از رﺳﻴﺪن ﺑﻪ ﺗﻌﺪاد ﻣﺸﺨﺼﻰ (ﺑﺮای ﻣﺜﺎل ٢۵، ۵٠ و ﻳﺎ ١٠٠ ﺗﻐﻴﻴﺮ) ﻳﻚ دﺳﺘﻮر Commit اﺟﺮا ﺷﻮد.
ﺷﻤﺎ ﺣﺘﻰ ﻣﻰ ﺗﻮاﻧﻴﺪ ﻇﺮﻓﻴﺖ اﻳﻦ ﺷﻤﺎرﻧﺪه را ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻣﺘﻐﻴﺮ در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻪ ﺑﺎ ﺗﻐﻴﻴﺮ ﺣﺠﻢ ﻛﺎر (Work Load)، اﻳﻦ ﻇﺮﻓﻴﺖ ﻫﻢ ﺗﻐﻴﻴﺮ ﻛﻨﺪ.
ﺑﺮای ﻣﺜﺎل ﻣﺸﺨﺺ ﻛﻨﻴﺪ زﻣﺎﻧﻰ ﻛﻪ ﻫﻤﺰﻣﺎﻧﻰ ﺗﺮاﻛﻨﺶ ﻫﺎ زﻳﺎد اﺳﺖ، ﻇﺮﻓﻴﺖ ﺷﻤﺎرﻧﺪه ﻗﺒﻞ از Commit، ٢۵ ﻋﺪد ﺑﺎﺷﺪ. و زﻣﺎﻧﻰ ﻛﻪ ﻫﻤﺰﻣﺎﻧﻰ ﻛﻤﺘﺮی در ﺗﺮاﻛﻨﺶ ﻫﺎ وﺟﻮد داردt اﻳﻦ ﻋﺪد ﺑﻪ ١٠٠ ﻳﺎ ﺑﺎﻻﺗﺮ ﺗﻐﻴﻴﺮ ﻛﻨﺪ. (اﻳﻦ اﻋﺪاد ﺻﺮﻓﺎ ﺟﻬﺖ ﻣﺜﺎل ﻣﻰ ﺑﺎﺷﻨﺪ و ﻧﺴﺒﺖ ﺑﻪ ﻧﻴﺎز ﻛﺎر ﺷﻤﺎ ﺑﺎﻳﺪ ﺗﻐﻴﻴﺮ ﻛﻨﺪ).
اﮔﺮ Commit ﺑﻪ درﺳﺘﻰ ﺻﻮرت ﻧﮕﻴﺮد، ﻣﻰ ﺗﻮاﻧﺪ ﻣﻨﺠﺮ ﺑﻪ Timeout، Deadlock و ﻳﺎ Escalation ﺷﻮد.
راه حل دوم:
راه ﺣﻞ دﻳﮕﺮ، ﺗﻌﻴﻴﻦ ﻛﺮدن زﻣﺎن از ﭘﻴﺶ ﻣﺸﺨﺺ ﺷﺪه ای، ﺑﺪون ﺗﻮﺟﻪ ﺑﻪ ﺗﻌﺪاد ﺗﺮاﻛﻨﺶ ﻫﺎ، ﺟﻬﺖ اﻋﻤﺎل Commit ﻣﻰ ﺑﺎﺷﺪ. به این معنی که مشخص گردد بعد از زمان مشخصی از شروع تراکنش ها، دستور Commit اجرا شود.
ﻫﺮ دو ﺗﻜﻨﻴﻚ ﺑﻪ ﺧﻮﺑﻰ ﻧﺘﻴﺠﻪ ﻣﻰ دﻫﻨﺪ. اﻣﺎ ﻫﻤﺎﻧﻨﺪ ﻣﺜﺎل ﺑﺎﻻ، راه ﺣﻞ ﻗﺎﺑﻞ ﭘﺎراﻣﺘﺮدﻫﻰ را ﺑﻪ ﺧﺎﻃﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ. (در اﻳﻦ ﻣﻮرد، ورودی Time ﺑﻪ ﻋﻨﻮان ﺗﻌﺪاد ﺛﺎﻧﻴﻪ ﻫﺎی ﺑﻴﻦ دو Commit در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻰ ﺷﻮد.)
راه حل سوم:
راه ﺣﻞ ﺑﻌﺪی، ﺑﺮرﺳﻰ ﻛﺮدن ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﺘﺎن (دﺳﺘﻪ ای و آﻧﻼﻳﻦ) و ﺗﻼش ﺑﺮای ﺗﻐﻴﻴﺮ ﻛﺪدﻫﻰ آن اﺳﺖ ﻛﻪ ﺑﺘﻮاﻧﻴﺪ دﺳﺘﻮر Commit را در ﻧﺰدﻳﻚ ﺗﺮﻳﻦ ﺟﺎی ﻣﻤﻜﻦ ﺑﻪ ﺗﻐﻴﻴﺮاﺗﺘﺎن اﺟﺮا ﻛﻨﻴﺪ.
ﺑﺎ ذﺧﻴﺮه ﺳﺎزی داده ﻫﺎی ﺗﻐﻴﻴﺮ داده ﺷﺪه ﺗﺎ ذﻗﻴﻘﺎ ﻗﺒﻞ از Commit، ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ ﻣﻴﺎﻧﮕﻴﻦ ﻣﺪت زﻣﺎن وﺟﻮد ﻗﻔﻞ ﺑﺮ روی ﻳﻚ ﻣﻨﺒﻊ را ﻛﺎﻫﺶ دﻫﻴﺪ. اﻳﻦ ﻣﻰ ﺗﻮاﻧﺪ ﺑﻪ ﻛﺎﻫﺶ درﮔﻴﺮی ﻗﻔﻞ ﻫﺎ در DB2 و در ﻧﺘﻴﺠﻪ ﻛﺎﻫﺶ Timeoutﻫﺎ ﻣﻨﺠﺮ ﺷﻮد.
ﺑﺎ ﺗﻮﺟﻪ ﻛﺮدن ﺑﻪ ﻧﺤﻮه ی ﻛﺪدﻫﻰ در ﺑﺮﻧﺎﻣﻪ ﻫﺎی DB2 و اﻋﻤﺎل ﻛﺮدن دﺳﺘﻮرات Commit دوره ای در زﻣﺎن اﻳﺠﺎد ﺗﻐﻴﺮات در داده، ﻣﻰ ﺗﻮاﻧﻴﺪ ﻣﺸﻜﻼت درﮔﻴﺮی ﻫﺎی ﻗﻔﻞ ﻫﺎ را ﻛﻤﺘﺮ و ﻳﺎ ﺣﺘﻰ ﻣﺘﻮﻗﻒ ﻛﻨﻴﺪ.
مقاله ی انگلیسی این مطلب، توسط Craig Mullins را می توانید در این صفحه مطالعه نمایید.