Транзакция – это термин, имеющий латинское происхождение, в переводе означающее «соглашение» или «обмен».
Чаще всего данный термин встречается в банковской сфере и подразумевает следующие операции:
Что такое транзакция?
Под транзакцией понимают:
Если говорить простыми словами, то транзакция – это добровольное перечисление денежных средств со счета клиента, либо покупателя в пользу лица, оказавшего услугу, либо продавшего товар. Каждая из операций отражается в базе данных финансовой организации, вне зависимости успешна она была проведена или нет.
Процент на остаток
Нет
Кешбек
до 30 %
Срок действия
5 лет
Выпуск
Бесплатно
Обслуживание
750 руб. в год
Система
Процент на остаток
до 6 %
Кешбек
до 15 %
Срок действия
5 лет
Выпуск
Бесплатно
Обслуживание
Бесплатно
Система
Процент на остаток
до 7 %
Кешбек
до 2 %
Срок действия
5 лет
Выпуск
Бесплатно
Обслуживание
Бесплатно
Система
Виды транзакций
В зависимости от личного участия сторон и условий проведения сделки выделяют два вида операции:
1. Онлайн — транзакция. Осуществление операций производится при участии посредника либо напрямую, но в режиме реального времени. Однако, участники сделки могут находиться на разных континентах. Яркими примерами являются:
2. Оффлайн – транзакция – это операции, не требующие непосредственного участия обоих сторон, производится с некоторой задержкой по времени. К таким действиям относятся:
Как происходит транзакция
Механизмы проведения транзакций типичны, чтобы иметь представление о данной операции необходимо понимать их.
Рассмотрим процесс на примере оплаты покупки в супермаркете с помощью банковской карты физического лица. Транзакция будет включать в себя четыре последовательных этапа.
Сделка происходит не между супермаркетом и покупателем, а между финансовыми организациями:
Для осуществления финансовой сделки банк – эквайр запрашивает разрешение на проведение операции у банка-эмитента. В случае покупки в супермаркете – на денежный перевод. Запрос формируется в момент помещения банковской карты в платежное устройство. При соприкосновении защитной линии карты и терминала производится отправка зашифрованных данных, касающихся персональной информации держателя карты, ее реквизитов и т.д.
Несмотря на то, что работа банковских систем является достаточно сложной и замысловатой, показанный пример позволяет понять, как происходит списание денежных средств с расчетной карточки клиента. Масштабы проведения таких сделок впечатляют – стоит лишь представить, сколько подобных операций проводится ежесекундно во всем мире.
Развитие современных технологий позволили сделать сложные технические сделки для держателей пластиковых карт простыми, отнимающими всего несколько секунд, безопасными, гарантировать полную сохранность персональных данных и конфиденциальность.
Минимальную информацию о том, в чем суть операции «транзакции» следует знать, поскольку обойтись без нее в современном мире невозможно.
Это такие процедуры, как:
Банковская транзакция бывает двух видов, которые определяются по условиям ведения операций, степени участия сторон:
Существует определённый алгоритм действий, заранее установленный для каждого вида транзакции. Его условия одинаковы применительно к любым участникам, ситуациям. Отменить сделку можно только по её завершению, изменения в процессе операции невозможны.
Как осуществляется транзакция
Механизм проведения данной операции типичен для всех случаев. Чтобы точнее понять, что это такое – транзакция по банковской карте, можно рассмотреть пример с оплатой товара банковской картой в супермаркете. В операции участвуют не физическое лицо (покупатель) и супермаркет (продавец), а 2 финансовые организации. Одна из них называется банком-эмитентом, другая – банком-эквайром. Первая выпускает и обслуживает карту, вторая занята обслуживанием терминала в магазине, где проходит сделка.
Транзакция предполагает 4 действия и осуществляется в следующей последовательности:
Функционирование банковской системы – работа достаточно сложная. Но, рассматривая показанный выше пример, человеку становится понятно, как с банковской карты списываются его денежные средства. Каждую секунду в мире проводится масса подобных операций.
Сегодня внедрение современных технологий позволяет владельцам банковских карточек совершать технически сложные сделки буквально за несколько секунд. При этом им гарантированы безопасность, конфиденциальность, полная сохранность его персональных данных. Поэтому всем держателям карт важно понимать суть транзакции, с которой он постоянно сталкивается в современном мире!
На пути к правильным SQL транзакциям (Часть 1)
Мне часто приходилось сталкиваться с тем, что люди прекрасно понимают, что такое транзакции в базе данных и для чего они нужны, но при этом не всегда умеют ими правильно пользоваться. Безусловно, для достижения 80-го уровня сакрального знания нужно иметь не один год опыта и прочесть множество толстенных книг по SQL. Поэтому в этой статье я даже не буду пытаться описать всё, что может быть связано с транзакциями в MS SQL. Я хочу затронуть один простой, но очень важный вопрос, который разработчики часто упускают из вида – уровни изоляции транзакций. Несмотря на то, что тема очень проста, во многих источниках она освящается плохо – информации либо очень мало, либо очень много. Т.е. прочитав 5-6 кратких теоретических определений невозможно их применить на практике. Для уверенного понимания предмета статьи нужно обращаться к специализированной литературе, но там информации на столько много, что далеко не каждый может уделить необходимое время для её усваивания. Сегодня я хочу поделиться своим простым рецептом, который помог мне раз и на всегда запомнить особенности уровней изоляции транзакций и по сей день помогает без проблем принимать взвешенные решения о выборе необходимого уровня.
Секрет предлагаемого способа запоминания в том, что краткая теория будет сопровождаться простыми практическими примерами, которые мне были бы на много понятней, чем подробное описание. И так, для понимания различий в уровнях изоляции необходимо разобраться с нежелательными побочными эффектами, которые могут возникать, если транзакции будут не изолированы друг от друга. Поняв специфику этих эффектов, нам останется только посмотреть, от каких эффектов защищает каждый отдельно взятый уровень. После этого, я уверен, что тема изоляции транзакций вам навсегда перестанет казаться чем-то заоблачно сложным.
Побочные эффекты параллелизма
Для создания таблицы и наполнения её данными можно запустить следующий скрипт.
Так же данный скрипт желательно выполнить перед рассмотрением каждого примера. Это будет гарантировать идентичность получаемых результатов с теми, что описаны ниже.
Отчет о цепном анализе: ритейлеры, ответственные за 80% транзакций NFT в 2021 году
На рынке НФТ по-прежнему наблюдается массовое внедрение по всей криптосфере. Хотя шумиха немного поутихла, трейдеры все еще вовлечены в сектор высоких полетов. Но в то время как присутствие институциональных инвесторов в секторе не может быть замечено, розничные трейдеры проводят большинство сделок в секторе. Этот момент подкрепляется недавним отчетом о цепном анализе, в котором аналитическая фирма утверждала, что 80% сделок, проведенных в этом году в секторе НФТ, были совершены розничными трейдерами.Стретчинг позы
Отчет о цепном анализе анализирует данные NFT по цепочке
Аналитическая фирма отнесла их к категории розничных продавцов, поскольку ни одна из их покупок не превысила отметку в 10 000 долларов. Эти заметные события на рынке были объяснены в недавнем отчете Chainalysis. Фирма изучила все детали рынка NFT с января по октябрь. При том, что розничные торговцы осуществляли 80% сделок в течение этого периода, на операции с коллекторами приходилось около 20%.
Это огромный рост, потому что за два месяца до 2021 года количество сделок выросло на 6%. В то время как институциональные трейдеры отвечали за оставшиеся 1% в секторе NFT, трейдеры отвечали за 26% объема торговли, говорится в отчете Chainalysis. Цепной анализ сгруппировал транзакции по тому, сколько они купили NFT. В отчете розничные торговцы потратили на NFT около 10 000 долларов, в то время как коллекционеры потратили на NFT больше, чем розничные торговцы, но менее 100 000 долларов.
Трейдеры потратили 26,9 миллиарда долларов
Отчет о цепном анализе также показал рост числа коллекторов за рассматриваемые месяцы. Chainalysis также отметил, что, хотя транзакции розничных торговцев были значительными, институциональные трейдеры и коллекционеры несли ответственность за большинство переводов, деноминированных в долларах. Этот отчет резко контрастирует с текущей тенденцией в централизованном криптосекторе, где розничные торговцы оказывают незначительное влияние на объем. Chainalysis также сказал, что еще одной причиной резкого роста внедрения NFT стало то, что создатели контента получили огромные вознаграждения. Согласно отчетам, ожидается, что сектор NFT завершит год с объемом транзакций 17,7 миллиарда долларов.
Продажи платформы NFT на прошлой неделе выросли на 300 миллионов долларов, а несколько покупок земель в Песочнице стали пусковым фактором. В отчете Chainalysis также подчеркивается, что в этом году трейдеры отправили крипто на смарт-контракты на платформах NFT на сумму 26,9 миллиарда долларов. Несмотря на массовые продажи в секторе NFT, в отчете Chainalysis говорится, что только 28,5% продаж принесли прибыль. Chainalysis высказал мнение, что трейдеры, которые намерены получать прибыль от NFT, должны сначала попытаться попасть в белый список.
Транзакции в T-SQL – основы для новичков с примерами
Приветствую всех посетителей сайта Info-Comp.ru! В этом материале мы с Вами подробно рассмотрим транзакции языка T-SQL, Вы узнаете, что это такое, для чего они нужны, а также какие команды управления транзакциями существуют в T-SQL.
Заметка! T-SQL – это расширение языка SQL, реализованное в Microsoft SQL Server. Более подробно об этом можете почитать в статье – Что такое T-SQL. Подробное описание для начинающих.
Транзакции в T-SQL
Транзакция – это команда или блок команд (инструкций), которые успешно завершаются как единое целое, при этом в базе данных все внесенные изменения фиксируются на постоянной основе, или отменяются, т.е. все изменения, внесенные любой командой, входящей в транзакцию, будут отменены. Другими словами, если одна команда или инструкция внутри транзакции завершилась с ошибкой, то все, что было отработано перед ней, также отменяется, даже если предыдущие команды завершились успешно.
Транзакции очень полезны и просто незаменимы в тех случаях, когда Вам необходимо реализовывать бизнес логику в базе данных Microsoft SQL Server, которая предполагает многошаговые операции, где каждый шаг логически связан с другими шагами.
По сути каждая отдельная инструкция языка T-SQL является транзакцией, это называется «Автоматическое принятие транзакций» или «Неявные транзакции», но также есть и явные транзакции, это когда мы сами явно начинаем транзакцию и также явно заканчиваем ее, т.е. делаем все это с помощью специальных команд.
Чтобы понять, как работают транзакции и для чего они нужны, давайте рассмотрим классический пример, который наглядно показывает необходимость использования транзакций.
Допустим, у Вас есть хранимая процедура, которая осуществляет перевод средств с одного счета на другой, соответственно, как минимум у Вас будет две операции в этой процедуре, снятие средств, и зачисление средств, например, две инструкции UPDATE.
Но в каждой из этих операций может возникнуть ошибка и инструкция не выполнится. А теперь представьте, что первая инструкция снимает деньги, она выполнилась успешно, вторая инструкция зачисляет деньги и в ней возникла ошибка, без транзакции снятые деньги просто потеряются, так как они никуда не будут зачислены.
Чтобы этого не допустить, все SQL инструкции, которые логически что-то объединяет, в данном случае все операции, связанные с переводом средств, пишут внутри транзакции, и тогда, если наступит подобная ситуация, все изменения будут отменены, т.е. деньги вернутся обратно на счет.
Транзакции можно сочетать с обработкой и перехватом ошибок TRY…CATCH, иными словами, Вы отслеживаете ошибки в Вашем блоке инструкций и если они появляются, то в блоке CATCH Вы откатываете транзакцию, т.е. отменяете все изменения, которые были успешно выполнены до возникновения ошибки в транзакции.
Транзакции – это отличный механизм обеспечения целостности данных.
Свойства транзакции
У транзакции есть 4 очень важных свойства:
Команды управления транзакциями в T-SQL
В T-SQL для управления транзакциями существуют следующие основные команды:
Примеры транзакций в T-SQL
Давайте рассмотрим примеры транзакций, реализованные на языке T-SQL.
Исходные данные для примеров
Но сначала нам необходимо создать тестовые данные для нашего примера.
Для этого выполните следующую инструкцию.
Простой пример транзакции в T-SQL
В данном примере у нас всего две инструкции, которые изменяют данные, но допустим, что они взаимосвязаны, т.е. они обе обязательно должны выполниться вместе или не выполниться также вместе.
Поэтому мы решили эти инструкции объединить в одну транзакцию.
Сначала мы открываем транзакцию командой BEGIN TRANSACTION, далее пишем все необходимые инструкции, которые мы хотим объединить в транзакцию.
После этого командой COMMIT TRANSACTION мы сохраняем все внесенные изменения.
В данном случае у нас нет никаких ошибок, все инструкции выполнились успешно. Как результат, транзакция завершена также успешно и все изменения сохранены на постоянной основе командой COMMIT TRANSACTION.
Однако, если в любой из инструкций возникнет ошибка, транзакция не завершится, и все изменения не сохранятся.
При этом, стоит помнить о том, что ошибки с определённым уровнем серьезности, например, ошибки, связанные с нарушением ограничений, не влекут за собой автоматический откат всех изменений внесенных текущей транзакцией, поэтому всегда необходимо использовать или инструкцию SET XACT_ABORT ON, или обработку ошибок (допускается и совместное использование).
Например, если во второй инструкции мы попытаемся записать в столбец Price какое-нибудь текстовое значение, то у нас возникнет ошибка, и изменения, внесённые первой инструкцией, не зафиксируются на постоянной основе.
Пример транзакции в T-SQL с обработкой ошибок
В языке T-SQL существует механизм перехвата и обработки ошибок – конструкция TRY… CATCH.
Эту конструкцию можно использовать для отслеживания появления возможных ошибок внутри транзакции и в случае появления таких ошибок предпринять определенные действия.
Сначала мы открываем блок для обработки ошибок, затем открываем транзакцию командой BEGIN TRANSACTION, далее пишем наши инструкции, например, те же самые две инструкции UPDATE.
После этого закрываем блок TRY, открываем блок CATCH, в котором в случае возникновения ошибки мы откатываем все изменения командой ROLLBACK TRANSACTION. Также мы принудительно завершаем нашу инструкцию командой RETURN.
Если ошибок нет, то в блок CATCH мы, соответственно, не попадаем и у нас выполнится команда COMMIT TRANSACTION, которая сохранит все изменения.
В этом примере нет ошибок, поэтому транзакция завершена успешно.
А в этом примере мы намерено допускаем ошибку во второй инструкции. Поэтому управление передается в блок CATCH, где мы откатываем все изменения, возвращаем номер и описание ошибки и принудительно завершаем всю инструкцию командой RETURN.
Первая инструкция отработала нормально, но ее изменения не были сохранены, так как вторая инструкция выполнена с ошибкой.
Уровни изоляции транзакций в T-SQL
Во время выполнения транзакции все данные, над которыми производятся изменения, блокируются, до завершения транзакции, так как, когда один процесс изменяет данные, другой процесс не может одновременно изменять их. В SQL сервере существует механизм, который блокирует (изолирует) данные во время выполнения транзакции. У данного механизма есть несколько уровней изоляции, каждый из которых определяет степень блокировки данных.
Давайте подробней рассмотрим уровни изоляции.
READ UNCOMMITTED
Самый низкий уровень, при котором SQL сервер разрешает так называемое «грязное чтение». Грязным чтением называют считывание неподтвержденных данных, иными словами, если транзакция, которая изменяет данные, не завершена, другая транзакция может получить уже измененные данные, хотя они еще не зафиксированы и могут отмениться.
READ COMMITTED
Этот уровень уже запрещает грязное чтение, в данном случае все процессы, запросившие данные, которые изменяются в тот же момент в другой транзакции, будут ждать завершения этой транзакции и подтверждения фиксации данных. Данный уровень по умолчанию используется SQL сервером.
REPEATABLE READ
На данном уровне изоляции запрещается изменение данных между двумя операциями чтения в одной транзакции. Здесь происходит запрет на так называемое «неповторяющееся чтение» или «несогласованный анализ». Другими словами, если в одной транзакции есть несколько операций чтения, данные будут блокированы и их нельзя будет изменить в другой транзакции. Таким образом, Вы избежите ситуации, когда вначале транзакции Вы запросили данные, провели их анализ (некое вычисление), в конце транзакции запросили те же самые данные, а они уже отличаются от первоначальных, так как они были изменены другой транзакцией.
Также уровень REPEATABLE READ, как и остальные, запрещает «Потерянное обновление» – это когда две транзакции сначала считывают одни и те же данные, а затем изменяют их на основе неких вычислений, в результате обе транзакции выполнятся, но данные будут те, которая зафиксировала последняя операция обновления. Это происходит потому, что данные в операциях чтения в начале этих транзакций не были заблокированы.
SERIALIZABLE
Данный уровень исключает чтение «фантомных» записей. Фантомные записи – это те записи, которые появились между началом и завершением транзакции. Иными словами, в начале транзакции Вы запросили определенные данные, в конце транзакции Вы запрашиваете их снова с тем же фильтром, но там уже есть и новые данные, которые добавлены другой транзакцией. Более низкие уровни изоляции не блокировали строки, которых еще нет в таблице, данный уровень блокирует все строки, соответствующие фильтру запроса, с которыми будет работать транзакция, как существующие, так и те, что могут быть добавлены.
SNAPSHOT и READ COMMITTED SNAPSHOT
Также существуют уровни изоляции, алгоритм которых основан на версиях строк, это
Иными словами, SQL Server делает снимок и хранит последние версии подтвержденных строк. В данном случае, клиенту не нужно ждать снятия блокировок, пока одна транзакция изменит данные, он сразу получает последнюю версию подтвержденных строк. Следует отметить, что уровни изоляции, основанные на версиях строк, замедляют операции обновления и удаления, так как перед этими операциями сервер делает и копирует снимок строк во временную базу данных.
SNAPSHOT – уровень хранит строки, подтверждённые на момент начала транзакции, соответственно, именно эти строки будут считаны в случае обращения к ним из другой транзакции. Данный уровень исключает повторяющееся и фантомное чтение примерно так же, как уровень SERIALIZABLE.
READCOMMITTEDSNAPSHOT – этот уровень изоляции работает практически так же, как уровень SNAPSHOT, с одним отличием, он хранит снимок строк, которые подтверждены на момент запуска команды, а не транзакции, как в SNAPSHOT.
Побочные эффекты параллелизма
На основе вышеизложенного мы можем выделить несколько побочных эффектов, которые могут возникнуть в результате параллельного использования данных:
Каждый из уровней изоляции устраняет определенные побочные эффекты. В таблице ниже приведены сводные данные.
Побочный эффект / Уровень изоляции
Потерянное обновление
Грязное чтение
Неповторяющееся чтение
Фантомные записи
READ UNCOMMITTED
Устраняет
Не устраняет
Не устраняет
Не устраняет
READ COMMITTED
Устраняет
Устраняет
Не устраняет
Не устраняет
REPEATABLE READ
Устраняет
Устраняет
Устраняет
Не устраняет
SERIALIZABLE
Устраняет
Устраняет
Устраняет
Устраняет
SNAPSHOT
Устраняет
Устраняет
Устраняет
Устраняет
READ COMMITTED SNAPSHOT
Устраняет
Устраняет
Устраняет
Устраняет
Включение уровня изоляции в T-SQL
Для того чтобы включить тот или иной уровень изоляции для всей сессии, необходимо выполнить команду SET TRANSACTION ISOLATION LEVEL и указать название уровня изоляции.
Также для уровней SNAPSHOT и READ COMMITTED SNAPSHOT предварительно необходимо включить параметр базы данных ALLOW_SNAPSHOT_ISOLATION для уровня изоляции SNAPSHOT и READ_COMMITTED_SNAPSHOT для уровня READ COMMITTED SNAPSHOT.
Заметка! Если Вас интересует язык SQL, то рекомендую почитать книгу «SQL код» – это самоучитель по языку SQL для начинающих программистов. В ней язык SQL рассматривается как стандарт, чтобы после прочтения данной книги можно было работать с языком SQL в любой системе управления базами данных.
На сегодня это все, надеюсь, материал был Вам полезен, до новых встреч!