Это скромный вопрос, заданный в духе расширения моих знаний; будьте любезны в своем ответе.
Как давний разработчик приложений, я знаю на каком-то уровне, что такое транзакция (я использую их все время). Оставляя в стороне уровни изоляции транзакций на данный момент, на высоком уровне транзакция позволяет полностью или совсем не завершить блок работы и обеспечивает определенную степень изоляции от других действий по модификации базы данных.
Я также знаю, что (в различных базах данных) это блокировка или, по крайней мере, как она себя ведет (если я каким-то образом явно блокирую таблицу, то никакой другой процесс или поток не может обновить что-либо об этой таблице).
То, о чем я наиболее отчетливо не понимаю, так это то, что в различных базах данных, когда я явно блокирую строку или таблицу, я использую те же самые конструкции, которые используются средствами транзакций базы данных под прикрытием, чтобы заставить транзакцию работать должным образом?
То есть мне приходит в голову, что для того, чтобы транзакция была атомарной и изолированной, она должна выполнять некоторую блокировку. Является ли эта блокировка, инициируемая транзакцией, скрытой трансакцией, той же самой блокировкой, что и различные базы данных, позволяющие мне получить доступ через конструкции, такие как SELECT FOR UPDATE
или явные LOCK
команды? Или эти два понятия совершенно разные?
Я еще раз прошу прощения за наивность этого вопроса; Я счастлив, что мне указывают на более фундаментальные источники.
источник
Немного предыстории, прежде чем отвечать на ваши вопросы:
Примечание. Это относится к Microsoft SQL Server - RDBMS ........
Теперь вернемся к вашим вопросам:
Да. Это означает, что вы должны быть осторожны при определении последовательности данных, которые будут изменены и которые приведут базу данных в согласованное состояние. Другими словами, ваша операция DML должна оставлять базу данных в согласованном состоянии, которое ограничивается бизнес-правилами вашей организации. Тем не менее, СУБД (здесь SQL Server) может обеспечить физическую целостность транзакции.
От BOL: Блокировка и управление версиями строк не позволяют пользователям читать незафиксированные данные и не позволяют нескольким пользователям одновременно изменять одни и те же данные. Без блокировки или контроля версий строк запросы, выполненные к этим данным, могут дать неожиданные результаты, возвращая данные, которые еще не были зафиксированы в базе данных.
Все в сервере sql содержится в транзакции. Когда вы получаете доступ к своим данным, СУБД должна блокироваться в зависимости от уровня изоляции и операций, которые вы выполняете над своими данными. Проверьте этот ответ для более подробной информации.
Несколько хороших ссылок:
источник
Я бы сказал, что транзакции являются частью «интерфейса» базы данных в том смысле, что вы, как разработчик, решаете, когда начинать, заканчивать, что делать в рамках транзакций и т. Д. Блокировки, на мой взгляд, относятся к деталям реализации. и используется для синхронизации доступа к различным объектам. В большинстве случаев сам двигатель решает, что и на какой срок следует заблокировать. Существует много блокировок системного уровня, которыми нельзя напрямую манипулировать (например, механизм может блокировать определенные области памяти). Даже когда речь идет о блокировках DML, многие из них происходят за кулисами (например, для обеспечения ссылочной целостности Oracle и, насколько я помню, SQLServer может установить блокировку соответствующей строки в основной таблице, если новая запись вставлена в таблица данных) в результате выписок DML, выпущенных в рамках транзакции.
Когда дело доходит до транзакций, вы можете ожидать более или менее согласованного поведения от любой RDMS, которая утверждает, что она соответствует SQL и поддерживает транзакции, но когда дело доходит до блокировок, почти каждый поставщик использует разные стратегии и терминологию. Насколько я могу судить, общая часть всех RMDS состоит в том, что параллелизм между транзакциями определяется уровнем изоляции, тогда как параллелизм между блокировками контролируется типами блокировок (разделяемая, исключительная и т. Д.).
Подводя итог, можно сказать, что блокировки - это низкоуровневый механизм контроля согласованности объектов и параллелизма. Блокировки могут быть выполнены во время выполнения операторов SQL. В зависимости от реализации уровня изоляции транзакции, механизм может устанавливать различные типы блокировок на затронутые объекты (строки, группы строк, индексы и т. Д.). Доступно ограниченное количество команд для ручной блокировки (
SELECT FOR UPDATE
,LOCK
). Блокировки DML могут быть расширены (зависит от RDMS, например, в SQLServer row-> page-> partition-> table). Блокировки также могут быть выданы ядром базы данных во время инициализации соединения, резервного копирования, восстановления, перекомпиляции процедуры / триггера / функции / и т. Д., Запуска, выключений и т. Д.Я не уверен, что это отвечает на ваш вопрос, но я надеюсь, что это имеет смысл.
источник
LOCK
илиSELECT FOR UPDATE
операторами, или через какой-то другой механизм.BEGIN TRANSACTION
сам по себе замков не выдает. Блокировки появятся после DML в транзакции.BEGIN TRANSACTION
сам не создает блокировки DML; на самом деле он должен выдавать некоторые внутренние блокировки, потому что он должен распределять ресурсы, добавлять запись в системную таблицу [s] (если есть), которая содержит активные транзакции, и т. д.Я буду использовать жаргон SQL Server, но концепции должны быть такими же для других поставщиков:
Каждая команда, которую вы выполняете, выполняется внутри транзакции. Эта транзакция может быть открыта явно с помощью BEGIN TRAN или неявно с помощью механизма базы данных. Причина, по которой неявная транзакция открыта, состоит в том, что ядру все еще необходимо поддерживать соответствие ACID и возможность отката.
Когда вы делаете SELECT FOR UPDATE, это просто означает, что пока транзакция выполняется, она будет удерживать определенную блокировку.
источник
Необходимы блокировки, и они составляют базу данных. Это предотвращает повреждение или аннулирование данных, когда несколько пользователей пытаются читать, а другие записывают в базу данных. Транзакционная изоляция обычно реализуется путем блокировки всего, к чему осуществляется доступ в транзакции. Плохие дизайнерские приложения широко используют концепцию блокировки базы данных :) !! Поэтому, чтобы избежать блокировки, сконцентрируйтесь на своем FK и макете данных.
Это все о кислоте: - прочитайте это, и это очистит ваш разум! ACID - это набор свойств, которые вы хотели бы применить при изменении базы данных.
Транзакция - это набор связанных изменений, которые используются для достижения некоторых свойств ACID. Транзакции являются инструментами для достижения свойств ACID.
Атомарность означает, что вы можете гарантировать, что вся транзакция произойдет или ничего не произойдет; Вы можете выполнять сложные операции как единое целое, все или ничего, а сбой, сбой питания, ошибка или что-либо еще не позволит вам находиться в состоянии, в котором произошли только некоторые связанные изменения.
Согласованность означает, что вы гарантируете, что ваши данные будут согласованы; ни одно из ограничений, связанных с данными, не будет нарушено.
Изоляция означает, что одна транзакция не может прочитать данные из другой транзакции, которая еще не завершена. Если две транзакции выполняются одновременно, каждая из них увидит мир так, как будто они выполняются последовательно, и если одна из них должна прочитать данные, записанные другой, ей придется подождать, пока другая не будет завершена.
Долговечность означает, что после завершения транзакции гарантируется, что все изменения были записаны на надежный носитель (например, на жесткий диск), и тот же факт, что транзакция была завершена, также записывается.
Таким образом, транзакции являются механизмом гарантирования этих свойств; они представляют собой способ группировки связанных действий таким образом, что в целом группа операций может быть атомарной, давать согласованные результаты, быть изолированной от других операций и надежно регистрироваться.
источник
LOCK
операторы, или они делают это с помощью какого-то другого механизма?