История сайта

Принципы работы блокировок в базе данных

Принципы работы блокировок

Блокировка — это объект, с помощью которого программы показывают зависимость пользователя от ресурса. Программы запрещают другим пользователям выполнять над ресурсами операции, которые негативно влияют на зависимость пользователя, владеющего блокировкой, от этого ресурса. Блокировки управляются внутрисистемными механизмами, они устанавливаются и снимаются в зависимости от действий пользователя.

Блокировки применяются в БД на разных уровнях. Их устанавливают для строк, страниц, ключей, диапазонов ключей, индексов, таблиц или баз данных. SQL Server динамически определяет уровень блокировки для каждого оператора Transact-SQL. Уровень, на котором задается блокировка, может варьироваться для разных объектов в пределах одного запроса. Пользователям не нужно определять уровень блокировки, администраторы также не должны заниматься его настройкой. Каждый экземпляр SQL Server гарантирует, что блокировки, действующие на одном уровне, не нарушат блокировок, установленных на другом уровне.

 

Существуют несколько видов блокировок: разделяемые, обновления, эксклюзивная, предварительные и блокировки схемы. Вид блокировки показывает уровень зависимости соединения от заблокированного объекта. SQL Server контролирует взаимодействие блокировок разных видов.

Lock mode

Description

Разделяемая

Shared (S)

Используется для операций, не изменяющих данные, например Select
Обновления

Update (U)

Используется на ресурсах, которые могут быть обновлены. Предотвращает коллизии, когда несколько процессов читают, блокируют и потенциально могут изменить ресурсы позднее
Экслюзивная

Exclusive (X)

Используется для действий операций модификации данных. Гарантирует, что несколько процессов не смогут изменять один и тот же ресурс одновременно
Предварительная

Intent

Используется для установки иерархии блокировок. Типы предварительных блокировок: предварительная разделяемая (IS), предварительная эксклюзивная (IX) и предварительная разделяемо-эксклюзивная (SIX)
Schema Используется когда выполняется операция, зависимая от схемы таблиц. Разновидности: модификации схемы (SCH-M) и стабильности схемы (SCH-S)
Bulk Update (BU) Используется в случае операций пакетного обновления данных в таблице и указано предложение TABLOCK

При разделяемой блокировке, конкурирующие процессы могут читать данные с тех же ресурсов, но не могут изменять эти ресурсы. Освобождение блокировки происходит после того, как инициирующий блокировку процесс прочитал данные ресурса, если только уровень изоляции не установлен равным Repeatable Read или Serializable.

Типичной ситуацией, когда используется блокировка обновления, является ситуация, когда процесс модификации сначала читает ресурс (строку или страницу), устанавливая разделяемую блокировку, а затем изменяет ресурс, что требует изменения типа блокировки на эксклюзивный. Если две транзакции пытаются изменить один и тот же ресурс, то сначала первая транзакция, начавшая операцию модификации меняет тип блокировки на эксклюзивный, а вторая транзакция снимает свою блокировку и ожидает пока первая не завершит операцию обновления ресурса. Это происходит потому, что две транзакции не могут одновременно редактировать один и тот же ресурс. Если транзакция модифицирует ресурс, используя блокировку обновления, то блокировка становится сначала эксклюзивной, а после обновления разделяемой.

Эксклюзивные блокировки предотвращают любой доступ к ресурсу другим процессам.

Предварительная блокировка означает, что процесс желает наложить блокировку (S или X) на один из ресурсов ниже по иерархии ресурсов. Например, предварительная блокировка на уровне таблицы означает, что транзакция будет пытаться накладывать блокировку на страницах или строках данной таблицы. Установка предварительной табличной блокировки может препятствовать установке эксклюзивной блокировки другой транзакции на страницу, принадлежащей данной таблице. Предварительные блокировки разделяются на 3 категории: предварительная эксклюзивная, предварительная разделяемая и предварительная разделяемо- эксклюзивная.

Предварительная разделяемая блокировка означает, что транзакция намерена наложить разделяемую блокировку на некоторое количество (но не на все) объектов ниже по иерархии.

Предварительная эксклюзивная – транзакция намерена изменить некоторое количество ресурсов ниже в иерархии.

Предварительная эксклюзивно-разделяемая, означает, что транзакция намерена прочитать все ресурсы ниже в иерархии и некоторые из них обновить. При этом возможно наложение другой транзакцией IS блокировки. Однако не может быть двух одновременных SIX блокировок на одном объекте.

SCHM блокировка накладывается в случае выполнения DDL оператора

SCHS блокировка используется при компиляции запросов. Эти блокировки не запрещают наложения другими транзакциями никаких других блокировок, даже эксклюзивных.

Блокировки пакетного обновления используются в случае пакетной загрузки данных в таблицу или когда используется фраза TABLOCK. Блокировки пакетного обновления позволяют работать транзакциям, загружающим массивы данных в таблицу и предотвращающие доступ другим транзакциям к БД.

В SQL Server предусмотрен алгоритм для обнаружения взаимоблокировок двух соединений. Если экземпляр SQL Server обнаружил взаимоблокировку, то одна из транзакций будет прекращена, что позволит продолжить выполнение другой.

Обработка взаимоблокировок

Взаимоблокировка возникает, когда два или более потоков, конкурирующих за ресурс, становятся взаимозависимыми. Взаимоблокировка возможна не только в РСУБД, но и в любой многопоточной системе, где поток способен захватить один или несколько ресурсов (например, блокировку). Если захватываемый ресурс в настоящее время принадлежит другому потоку, то первый поток ожидает освобождения целевого ресурса его владельцем. В такой ситуации говорят о зависимости ожидающего потока от потока, владеющего некоторым ресурсом.

Если поток-владелец пытается захватить другой ресурс, принадлежащий в настоящее время ожидающему потоку, возникает взаимоблокировка. Ни один поток не может освободить задействованные ресурсы, пока их транзакции не будут зафиксированы или отменены, а этого не случится, поскольку оба потока ожидают освобождения ресурса другим потоком.

Минимизация числа взаимоблокировок

Хотя полностью избежать взаимоблокировок не удается, их число можно существенно уменьшить, чтобы увеличить пропускную способность при обработке транзакций и снизить системные издержки, поскольку меньше транзакций будут подвергаться откату с отменой всей выполненной ими работы. Кроме того, уменьшится число транзакций, повторно переданных приложениями на сервер из-за отката в результате взаимоблокировок.

Чтобы минимизировать число взаимоблокировок, необходимо придерживаться следующих правил:

• не изменять порядок обращения к объектам;

• избегать взаимодействия с пользователем во время транзакции;

• следить, чтобы транзакции были короткими и не выходили за пределы одного пакета;

• использовать низкие уровни изоляции;

• использовать привязанные соединения.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Реклама от гугла
Новости Белогорья Недавние статьи</div> </div><div class="art-blockcontent"> <ul> <li> <a href="http://vapankov.ru/?p=44961">Два пьяных водителя попались за рулём одной и той же «семёрки» за ночь</a> </li> <li> <a href="http://vapankov.ru/?p=44962">Под новый год россияне заняли в МФО на 12,6 % больше денег, чем осенью</a> </li> <li> <a href="http://vapankov.ru/?p=44963">Индексация выплат, загранпаспорт в МФЦ и новые кредиты – с 1 февраля в России</a> </li> <li> <a href="http://vapankov.ru/?p=44964">100-летие со дня образования Ленинского комсомола отметят в Белгороде</a> </li> <li> <a href="http://vapankov.ru/?p=44965">Артём Семейкин не прибыл на первый сбор «Энергомаша»</a> </li> </ul> </div> </div><div id="meta-2" class="art-block widget widget_meta clearfix"> <div class="art-blockheader"> <div class="t">Мета</div> </div><div class="art-blockcontent"> <ul> <li><a href="http://vapankov.ru/wp-login.php?action=register">Регистрация</a></li> <li><a href="http://vapankov.ru/wp-login.php">Войти</a></li> <li><a href="http://vapankov.ru/?feed=rss2"><abbr title="Really Simple Syndication">RSS</abbr> записей</a></li> <li><a href="http://vapankov.ru/?feed=comments-rss2"><abbr title="Really Simple Syndication">RSS</abbr> комментариев</a></li> <li><a href="https://ru.wordpress.org/" title="Сайт работает на WordPress — современной персональной платформе для публикаций.">WordPress.org</a></li> </ul> </div> </div> </div> </div> </div> </div><footer class="art-footer clearfix"><p><a href="http://vapankov.ru/?feed=rss2" class="art-rss-tag-icon" title="Сайт Василия Панкова RSS Feed" style="float: left; line-height: 0px;"></a></p> <a href="#">Link1</a> | <a href="#">Link2</a> | <a href="#">Link3</a></p> <p>Copyright © 2011 - 2018гг. All Rights Reserved.</p> <!--LiveInternet counter--><script type="text/javascript"><!-- document.write("<a href='http://www.liveinternet.ru/click' "+ "target=_blank><img src='//counter.yadro.ru/hit?t16.3;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+ ";"+Math.random()+ "' alt='' title='LiveInternet: показано число просмотров за 24"+ " часа, посетителей за 24 часа и за сегодня' "+ "border='0' width='88' height='31'><\/a>") //--></script><!--/LiveInternet--> <!-- Yandex.Metrika informer --> <a href="https://metrika.yandex.ru/stat/?id=25737512&from=informer" target="_blank" rel="nofollow"><img src="//bs.yandex.ru/informer/25737512/3_1_B8BBFFFF_989BF0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:25737512,lang:'ru'});return false}catch(e){}"/></a> <!-- /Yandex.Metrika informer --> <!-- Yandex.Metrika counter --> <script type="text/javascript"> (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter25737512 = new Ya.Metrika({id:25737512, clickmap:true, trackLinks:true, accurateTrackBounce:true}); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); </script> <noscript><div><img src="//mc.yandex.ru/watch/25737512" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --></footer> </div> <p class="art-page-footer"> <span id="art-footnote-links">Designed by Василий.</span> </p> </div> <div id="wp-footer"> <script type='text/javascript' src='http://vapankov.ru/wp-content/plugins/si-captcha-for-wordpress/captcha/si_captcha.js?ver=1.0'></script> <script type="text/javascript"> //<![CDATA[ var si_captcha_styles = "\ <!-- begin SI CAPTCHA Anti-Spam - comment form style -->\ <style type='text/css'>\ div#captchaImgDiv { display:block; }\ .captchaSizeDivSmall { width:175px; height:45px; padding-top:10px; }\ .captchaSizeDivLarge { width:250px; height:60px; padding-top:10px; }\ img#si_image_com,#si_image_reg,#si_image_log,#si_image_side_login { border-style:none; margin:0; padding-right:5px; float:left; }\ .captchaImgRefresh { border-style:none; margin:0; vertical-align:bottom; }\ div#captchaInputDiv { display:block; padding-top:15px; padding-bottom:5px; }\ label#captcha_code_label { margin:0; }\ input#captcha_code { width:65px; }\ </style>\ <!-- end SI CAPTCHA Anti-Spam - comment form style -->\ "; jQuery(document).ready(function($) { $('head').append(si_captcha_styles); }); //]]> </script> <script type='text/javascript'>jQuery(document).ready(function(){ jQuery('a.colorbox').colorbox({iframe:true, width:'80%', height:'80%'});jQuery('a.rssmi_youtube').colorbox({iframe:true, innerWidth:425, innerHeight:344})});</script><!-- Scroll Triggered Boxes v2.2.1 - https://wordpress.org/plugins/scroll-triggered-boxes/--> <div class="stb-container stb-top-left-container"> <div class="scroll-triggered-box stb stb-342 stb-top-left" id="stb-342" style="display: none;"> <div class="stb-content"> <p><strong><span style="color: #ff0000;">ВНИМАНИЕ! САНКЦИИ!</span></strong></p> <p>Санкции введены ТОЛЬКО в отношении Барака Обамы! <span style="color: #ff0000;"><strong>Бараку</strong></span> <span style="color: #ff0000;"><strong>ЗАПРЕЩЕНО посещать этот сайт!!!</strong></span></p> <p><strong><span style="color: #ff0000;">ATTENTION! SANCTIONS!</span></strong></p> <p>Sanctions were imposed ONLY in respect of Barack Obama! <span style="color: #ff0000;"><strong>Barack NOT visit this site!!!</strong></span></p> <p> </p> <p><span style="color: #0000ff;">После закрытия этого окна, оно сегодня больше не появится.</span></p> <p><span style="color: #0000ff;">After closing this window, it will not show up today.</span></p> </div> <span class="stb-close">×</span> </div> </div> <div id="stb-overlay"></div><!-- / Scroll Triggered Box --><script type='text/javascript' src='http://vapankov.ru/wp-content/plugins/akismet/_inc/form.js?ver=3.1.11'></script> <link rel='stylesheet' id='wprssmi_colorbox-css' href='http://vapankov.ru/wp-content/plugins/wp-rss-multi-importer/css/colorbox.css?ver=4.5.14' type='text/css' media='all' /> <link rel='stylesheet' id='frontend-css' href='http://vapankov.ru/wp-content/plugins/wp-rss-multi-importer/css/frontend.css?ver=4.5.14' type='text/css' media='all' /> <script type='text/javascript' src='http://vapankov.ru/wp-includes/js/comment-reply.min.js?ver=4.5.14'></script> <script type='text/javascript'> /* <![CDATA[ */ var STB_Global_Options = {"testMode":""}; var STB_Box_Options = {"342":{"id":342,"title":"\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 ! \u0421\u0430\u043d\u043a\u0446\u0438\u0438! Attention! Sanctions!","trigger":"percentage","triggerPercentage":0,"triggerElementSelector":"","animation":"fade","cookieTime":1,"autoHide":false,"autoShow":true,"position":"top-left","minimumScreenWidth":0,"unclosable":false}}; /* ]]> */ </script> <script type='text/javascript' src='http://vapankov.ru/wp-content/plugins/scroll-triggered-boxes/assets/js/script.min.js?ver=2.2.1'></script> <script type='text/javascript' src='http://vapankov.ru/wp-includes/js/wp-embed.min.js?ver=4.5.14'></script> <script type='text/javascript' src='http://vapankov.ru/wp-content/plugins/wp-rss-multi-importer/scripts/jquery.colorbox-min.js?ver=4.5.14'></script> <script type='text/javascript' src='http://vapankov.ru/wp-content/plugins/wp-rss-multi-importer/scripts/detect-mobile.js?ver=4.5.14'></script> <script type='text/javascript' src='http://vapankov.ru/wp-content/plugins/wp-rss-multi-importer/scripts/show-excerpt.js?ver=4.5.14'></script> <!-- 47 queries. 0,331 seconds. --> </div> </body> </html>