User defined transaction ошибка что это
Почему транзакция отклонена: все причины
Расскажем, почему банк отклоняет транзакцию…
На вопрос, почему транзакция отклонена, существует, как минимум, несколько ответов. Проблема может заключаться как в самой карте, так и в работе банка-эмитента.
Сегодня узнаем — что делать, если банк получателя отклонил транзакцию и какие причины этого сбоя существуют.
Причины отклонения транзакции
Владельцу карты, обычно, самостоятельно приходиться разбираться, почему не проходит транзакция: большинство банков причины не сообщают.
Если не проходит платеж в интернет-магазине, то причиной могут быть технические работы на сайте магазина, сбои на серверах платежного шлюза или ошибки в платежных сервисах (Steam, Яндекс.Касса). Когда реквизиты карты или счета) введены с ошибками, транзакция также не пройдет
Проблемы с картой возникают в следующих случаях:
Проблема, почему отклонена транзакция, возникнет и в случае, когда на счету недостаточно денежных средств для совершения той или иной транзакции. Нужно посмотреть баланс и если средств недостаточно — пополнить карту, либо — выбрать другой вариант оплаты.
К любой банковской карте привязывается номер телефона. Если транзакция отклоняется, значит не был введён проверочный СМС-код.
Банк отклонил транзакцию: что делать
В первую очередь, важно установить причину этого сбоя. Если дело в технической ошибке на сайте магазина, операцию можно попробовать провести позже. Если же транзакция отклоняется и через несколько часов, после возникновения первого сбоя, то нужно связаться с поддержкой магазина и максимально подробно описать сложившуюся ситуацию.
Транзакция отклонена оператором
В некоторых случаях, транзакция может отклоняться, если в системе существует вредоносный код.
Нужно установить Антивирус Касперского и запустить полную проверку системы. Если заблокирована сама карта, во многих случаях, её можно разблокировать просто позвонив в банк. Достаточно сообщить ФИО и одно кодовое слово
Выяснив, почему транзакция отклонена, устранить возникшую проблему с оплатой получится максимально быстро. В любом случае, в первую очередь, необходимо проверить баланс карты — скорее всего на ней просто не достаточно средств. Лишь после этого нужно пытаться решить возникшую проблему.
Коды ошибок Visa/MasterCard/МИР
В данной статье собраны коды ошибок действующих банков-эквайеров.
Часто встречающиеся ошибки:
Код 05 – отказ эмитента без указания причины
Код 17 – отказать, отклонено пользователем карты
Код 41 – утерянная карта
Код 43 – украденная карта
Код 51 – недостаточно средств для проведения операции
Код 57 – недопустимый тип операции для данного типа карты (например, попытка оплаты в магазине по карте предназначенной только для снятия наличных)
Код 61 – превышение максимальной суммы операции или количества попыток для данной карты; превышен лимит на терминале продавца; недостаточно средств на счете продавца, в случае выплат (более точное описание смотрите ниже, исходя из обслуживающего банка)
Код 62 – заблокированная карта
Код 65 – превышение максимального количества операции для данной карты
Код 83 – ошибка сети (технические проблемы)
Код 91 – эмитент недоступен (технические проблемы на стороне банка-эмитента)
Код 96 – системная ошибка/невозможно связаться с банком, который выдал карту (требуется сверка с эквайером)
Полный список кодов ПАО « Промсвязьбанк » :
Result Code | Description | Описание |
0 | Approved | Операция прошла успешно |
1 | Call your bank | Позвоните в свой банк |
3 | Invalid merchant | Недействительный продавец |
4 | Your card is restricted | Ограничение в проведении операции на стороне эмитента |
5 | Transaction declined | Операция отклонена без указания причины |
12 | Invalid transaction | Недействительная операция, возможно ошибки в параметрах запроса к платёжной системе |
13 | Invalid amount | Недопустимая сумма |
14 | No such card | Такая карта не существует |
15 | No such card/issuer | Нет такой карты / эмитента |
20 | Invalid response | Неверный ответ |
30 | Format error | Ошибка в параметрах запроса к платёжной системе |
41 | Lost card | Карта утеряна (статус установлен у эмитента) |
43 | Stolen card | Карта украдена |
51 | Not sufficient funds | Недостаточно средств |
54 | Expired card | Срок действия карты истёк |
55 | Incorrect PIN | Неверный PIN-код |
57 | Not permitted to client | Операция не разрешена для клиента (как правило, о тказ приходит со стороны платёжной системы) |
58 | Not permitted to merchant | Не разрешено продавцу (заблокирован терминал) |
61 | Exceeds amount limit | Сумма операции превысила допустимый лимит (также, возможен отказ от платёжной системы) |
62 | Restricted card | Запрещённая карта |
63 | Security violation | Нарушение безопасности |
65 | Exceeds frequency limit | Превышен лимит |
75 | PIN tries exceeded | Превышено количество попыток ввода PIN-кода |
76 | Wrong PIN,tries exceeded | Неверный PIN-код, количество попыток превышено |
82 | Time-out at issuer | Тайм-аут при соединении с эмитентом |
83 | Transaction failed | Транзакция неуспешна |
86 | Unable to verify PIN | Невозможно проверить PIN-код |
89 | Authentication failure | Ошибка аутентификации |
91 | Issuer unavailable | Эмитент недоступен |
93 | Violation of law | Операция отклонена. Держателю необходимо обратиться в свой банк |
95 | Reconcile error | Возникает, когда операция была уже проведена. |
96 | System malfunction | Системная ошибка \ Возможно ошибки в параметрах запроса к платёжной системе |
-2 | Bad CGI request | Неверно сформирован запрос к платёжному шлюзу |
-3 | No or Invalid response received | Платёжный шлюз вовремя не получил ответ. Статус операции при этом может быть успешным или неуспешным. |
-4 | Server is not responding | Сервер не отвечает |
-5 | Connect failed | Сбой соединения |
-8 | Error in card number field | Ошибка в поле номера карты |
-9 | Error in card expiration date field | Введена неверная дата срока действия карты |
-10 | Error in amount field | Ошибка в поле суммы |
-11 | Error in currency field | Ошибка в поле валюты |
-12 | Error in merchant terminal field | Некорректный запрос к платежному шлюзу |
-17 | Access denied | Отказано в доступе (Возможно ошибка при формировании P_SIGN) |
-18 | Error in CVC2 or CVC2 Description fields | Ошибка в поле CVC2 |
-19 | Authentication failed | Аутентификация прошла неуспешно (3d-secure), возможны другие причины. |
-20 | Expired transaction | Время проведения операции превышает значение параметра TIMESTAMP |
-21 | Duplicate transaction | Отправлен повторный запрос с идентичными параметрами |
70001 | Not sufficient funds | Недостаточно средств на счете. |
Полный список кодов ПАО Банк «ФК Открытие»:
Result Code | Description | Описание |
00 | Approved | Успешная транзакция |
01 | Refer to card issuer | Обратитесь к эмитенту карты |
02 | Refer to card issuer, special condition | Обратитесь к эмитенту карты, особое условие |
03 | Invalid merchant or service provider | Недействительный идентификатор продавца |
04 | Pickup card | Изъять карту |
05 | Do not honor | Транзакция была отклонена эмитентом без объяснения причин |
06 | Error | Эмитент карты вернул ошибку без дополнительных объяснений |
07 | Pickup card, special condition (other than lost/stolen card) | Изъять карту, специальные условия |
08 | Honor with identification | Не пройдена идентификация, проблема с идентификацией |
09 | Request in progress | Выполняется запрос |
10 | Approved for partial amount | Одобрено для частичной суммы |
11 | Approved, VIP Approved, VIP program | Одобрено для VIP, программа VIP |
12 | Invalid transaction | Запрошенная транзакция не поддерживается или недействительна для представленного номера карты |
13 | Invalid amount | Сумма превышает лимиты, установленные эмитентом для данного типа транзакции |
14 | Invalid card (no such number) | Эмитент указывает, что эта карта недействительна. |
15 | No such issuer | Номер эмитента карты недействителен |
16 | Approved, update track 3 | Утверждено, обновить |
17 | Customer cancellation | Отмена клиентом |
18 | Customer dispute | Открыт спор с клиентом |
19 | Re-enter transaction | Клиент должен повторно отправить транзакцию |
20 | Invalid response | Неверный ответ |
21 | No action taken | Никаких действий не предпринимается. Эмитент отказался без других объяснений |
22 | Suspected malfunction | Предполагаемая неисправность |
23 | Unacceptable transaction fee | Неприемлемая комиссия за транзакцию |
24 | File update not supported | Обновление файла не поддерживается |
25 | Unable to locate record | Невозможно найти запись |
26 | Duplicate record | Дублирующая запись |
27 | File update edit error | Ошибка редактирования обновления файла |
28 | File update file locked | Файл/обновления файла заблокировано |
29 | not used | не используется |
30 | Format error | Ошибка формата |
31 | Bank not supported | Банк не поддерживается коммутатором |
32 | Completed partially | Завершено частично |
33 | Expired card, pick-up | Срок действия карты истек |
34 | Issuer suspects fraud, pick-up card | Эмитент карты подозревает мошенничество |
35 | Contact acquirer, pick-up | Обратиться к эмитенту карты |
36 | Restricted card, pick-up | Ограничено эмитентом карты |
37 | Call ECHO security, pick-up | Обратитесь в службу безопасности |
38 | PIN tries exceeded, pick-up | Количество попыток получения PIN-кода превышает лимиты эмитента |
39 | No credit account | Нет кредитного счета |
40 | Function not supported | Запрошенная функция не поддерживается |
41 | Pickup card (lost card) | Карта была утеряна |
42 | No universal account | Нет универсальной учетной записи |
43 | Pickup card (stolen card) | Карта была украдена |
44 | No investment account | Нет инвестиционного счета |
45 | 50 not used | не используется |
51 | Not sufficient funds | Недостаточно средств на карте |
52 | No checking account | Нет текущего счета |
53 | No savings account | Нет сберегательного счета |
54 | Expired card | Срок действия карты истек |
55 | Incorrect PIN | Неправильный PIN-код держателя карты |
56 | No card record | Нет такой карты |
57 | Transaction not permitted to cardholder | Операция не разрешена держателю карты. Карта не разрешена для запрошенного типа транзакции. |
58 | Transaction not permitted on terminal | Транзакция не разрешена на терминале. Продавцу запрещен этот тип транзакции (заблокирован терминал; сработало ограничение и т.д. необходимо уточнять подробности у эквайера) |
59 | Suspected fraud | Предполагаемое мошенничество |
60 | Contact ECHO | Связаться с службой безопасности |
61 | Exceeds withdrawal limit | |
62 | Restricted card | Карта заблокирована |
63 | Security violation | Нарушение безопасности. Карта заблокирована |
64 | Original amount incorrect | Неверная исходная сумма |
65 | Activity count limit exceeded | Превышено допустимое количество ежедневных транзакций |
66 | Call acquirer security | Связаться со службой безопасности эквайера |
67 | not used | не используется |
68 | Response received too late | Ответ получен слишком поздно |
69 | 74 not used | не используется |
75 | PIN tries exceeded | Превышено допустимое количество попыток ввода PIN-кода |
76 | Invalid «to» account | Неверный счет. Дебетового счета не существует |
77 | Invalid «from» account | Недействительный счет. Кредитный счет не существует |
78 | Invalid account specified (general) | Связанная учетная запись с номером карты недействительна или не существует |
79 | Already reversed | Уже отменено |
80 | Visa transactions: credit issuer unavailable | Операции с Visa: эмитент недоступен |
81 | PIN cryptographic error found | Обнаружена криптографическая ошибка PIN-кода |
82 | Negative CAM, dCVV, iCVV, or CVV results | Некорректный CAM, dCVV, iCVV или CVV |
83 | Unable to verify PIN | Невозможно проверить PIN-код |
84 | Invalid authorization life cycle | Просроченная авторизация |
85 | not used | не используется |
86 | Cannot verify PIN | Невозможно проверить PIN-код |
87 | Network Unavailable | Сеть недоступна |
88 | Invalid CVC2 | Ошибочно введенный cvc2 |
89 | Ineligible to receive financial position information | Невозможно получить финансовую информацию |
90 | Cut-off in progress | Отключение в процессе |
91 | Issuer or switch inoperative | Банк-эмитент недоступен |
92 | Routing error | Ошибка маршрутизации |
93 | Violation of law | Нарушение закона |
94 | Duplicate transaction | Дублирующая транзакция |
95 | Reconcile error | Ошибка согласования/ошибка при расчетах с МПС/НСПК |
96 | System malfunction | Произошла системная ошибка |
97 | not used | не используется |
98 | Exceeds cash limit | Превышен денежный лимит |
-2 | Bad CGI request | Запрос не прошел CGI-проверку |
-3 | No or Invalid response received | Хост эквайрера (NS) не отвечает |
-4 | Server is not responding | Нет соединения с хостом эквайрера |
-5 | Connect failed | Ошибка соединения с хостом эквайрера (NS) во время обработки транзакции |
-6 | Configuration error | Ошибка настройки модуля e-Gateway |
-7 | Incorrect response from the acquirer host | Некорректный ответа хоста эквайрера (NS), например, отсутствуют обязательные поля |
-8 | Error in card number field | Ошибка в поле «Card number» запроса |
-9 | Error in card expiration date field | Ошибка в поле «Card expiration date» запроса |
-10 | Error in amount field | Ошибка в поле «Amount» запроса |
-11 | Error in currency field | Ошибка в поле «Currency» запроса |
-12 | Error in merchant terminal field | Ошибка в поле «Merchant ID» запроса |
-13 | System error | IP-адрес источника транзакции (обычно IP торговца) не соответствует ожидаемому |
-14 | No connection | Нет соединения с PIN-клавиатурой Интернет-терминала либо программа-агент на компьютере/рабочей станции Интернет-терминала не запущена |
-15 | Error in the «RRN» field of the request | Ошибка в поле «RRN» запроса |
-16 | Another transaction is in progress on the terminal | На терминале выполняется другая транзакция |
-17 | The terminal is denied access to the e-Gateway module | Терминалу отказано в доступе к модулю e-Gateway |
-18 | Error in the «CVC2» or «CVC2 Description» field of the request | Ошибка в поле «CVC2» или «CVC2 Description» запроса |
-19 | Error in request for authentication information or authentication failed | Ошибка в запросе на аутентификационную информацию либо аутентификация неуспешна |
-20 | Permissible time interval exceeded | Превышен допустимый временной интервал (по умолчанию – 1 час) между значением поля «Time Stamp» запроса и временем модуля e-Gateway |
-21 | Transaction has already been completed | Транзакция уже выполнена |
-22 | Transaction contains invalid authentication information | Транзакция содержит ошибочную аутентификационную информацию |
-23 | Error in transaction context | Ошибка в контексте транзакции |
-24 | Inconsistency in the context of a transaction | Несоответствие в контексте транзакции |
-25 | Transaction aborted by user | Транзакция прервана пользователем |
-26 | Invalid BIN of the card | Неверный BIN карты |
-27 | Seller name error | Ошибка в имени продавца |
-28 | Error in additional data | Ошибка в дополнительных данных |
-29 | Error in authentication link (damaged or duplicated) | Ошибка в ссылке аутентификации (повреждена или дублируется) |
-30 | Transaction was rejected as fraudulent | Транзакция отклонена как мошенническая |
-31 | Transaction in progress | Транзакция в процессе выполнения |
-32 | Re-declined transaction | Повторная отклоненная транзакция |
-33 | client authentication in progress | Транзакция в процессе аутентификации клиента с помощью авторизации случайной суммы или одноразового случайного кода |
-34 | MasterCard Installment транзакция в процессе выбора пользователем способа оплаты | |
-35 | MasterCard Installment транзакция в процессе выбора пользователем способа оплаты была отклонена автоматически после превышения лимита времени на эту операцию | |
-36 | MasterCard Installment транзакция в процессе выбора пользователем способа оплаты была отклонена самим пользователем |
Полный список кодов АО «Банк Русский Стандарт»:
Коды отказов платежных систем Visa, MasterCard, МИР (общее описание)
Error and Transaction Handling in SQL Server
Part Two – Commands and Mechanisms
An SQL text by Erland Sommarskog, SQL Server MVP. Latest revision: 2021-12-04.
Copyright applies to this text. See here for font conventions used in this article.
Introduction
This article is the second in a series of three about error and transaction handling in SQL Server. The purpose of the first article was to give you a jumpstart on error handling without going into the very many details of error handling in SQL Server. On the other hand, the focus of this part is exactly that: a detailed description of the commands for error and transaction handling and what can happen when an error occurs during the execution of a stored procedure or similar. In Part Three, I use this knowledge as a base for a discussion on how we should implement error handling in SQL Server in different situations. In addition to the three main parts, there are three appendixes that discuss special topics: linked servers, the CLR and Service Broker respectively.
Part One was intended for everyone, including the very unexperienced reader. In contrast, Parts Two and Three and the appendixes assume that you have some general programming experience, although necessarily not with SQL Server. Parts Two and Three are also considerably longer. If you arrived directly to this article from elsewhere on the web, I recommend that you read Part One first, since the examples in this article make use of error_handler_sp which I introduce in the jumpstart article.
This article aims at guiding the reader through this maze. In the first chapter after this introduction I look at the components of an error message. In chapter three, I cover the basics for transactions in SQL Server and in chapter four I cover statements that one way or another are related to error handling. Then we come to chapter five which is the centrepiece of this article: I attempt to classify errors from the different actions SQL Server may take in case of an error. In chapter six I discuss special contexts where the rules are altered one way or another. The article closes with three shorter chapters: one on additional commands for error and transaction control, one that covers transaction and error handling in natively compiled stored procedures in SQL 2014 and finally there is a chapter about various odd situations that fall outside of the other patterns.
Index of All Error-Handling Articles
Here follows a list of all articles in this series:
Appendix 2 – CLR. (Extends both Parts Two and Three.)
All the articles above are for SQL 2005 and later. For those who still are on SQL 2000, there are two older articles:
Dedication
The Anatomy of an Error Message
A message returned from SQL Server through the TDS protocol contains seven components. Here is an example of such a message as it appears in SQL Server Management Studio (SSMS):
Msg 547, Level 16, State 0, Procedure delete_order, Line 2
The DELETE statement conflicted with the REFERENCE constraint «FK_Order_Details_Orders». The conflict occurred in database «Northwind», table «dbo.Order Details», column ‘OrderID’.
Server – The server the error originated from. SSMS does not display this item, but other tools such as SQLCMD do.
Severity level – This value, 16 in this example, indicates how serious the error is in its own peculiar way. Here is the short story: levels 0-9 are purely informational messages. Level 10 never occurs. Levels 11-16 are regular SQL errors like constraint violations, permission errors etc. Level 17-25 are various resource and corruption errors. If the severity is ≥ 20, the connection is terminated. I go into a little more detail in the following section.
Procedure – If the error occurred in a stored procedure, trigger or user-defined function, the name appears here. If the error is from an ad-hoc batch or from dynamic SQL, this component is not included in the error message. It can pay off to give attention to the procedure name. When running an INSERT or an UPDATE statement you may get an error message which does not seem to fit at all. But if you look at the procedure name, you may find that the error message comes from a trigger. On SQL 2016 and earlier, you always get the procedure name without the schema. On SQL 2017 and later, the schema appears if it was included in the EXEC statement. See further the discussion of error_procedure() in the section error_message() & co below.
Line – On which line in the procedure or batch the error occurred. If the line number is 0, this indicates that something went wrong in the call to the procedure (or when the procedure exited). The line number typically points to the line where the failing statement starts. For a compilation error, it can be a line within the statement where SQL Server thinks you went wrong. Beware that recent versions of SSMS may modify the line number, see the section Line Numbers in SSMS below.
Message text – The actual text of the error message. That is, the text in red starting with The DELETE statement. in the example above. The text The statement has been terminated is a separate message, as discussed below.
More Details on the Severity Levels
The severity level is a somewhat confusing matter. The topic Database Engine Error Severities in Books Online attempts to document the severity levels, but I’m not sure things are as exact as Books Online would have it. Here is my summary of what I think is relevant about severity levels:
«False» Error Messages
There are some «false» error messages. That is, messages that do not come from SQL Server, but where the API or the tool still present them in that format. One you may see in SSMS is this:
Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
The level for this error is either 11 or 20. Sometimes you get two messages, one with each level. The error indicates that there was an internal error somewhere, be that in SQL Server or in SSMS (or more precisely in SqlClient). When you see this message, the connection has typically been closed. My theory is that internal errors in SQL Server result in level 20, while an exception in SSMS/SqlClient only produces a level 11 message, but this is nothing I have been able to confirm. I have found when working with this series of articles that even if the exception occurs in the client API, SQL Server may still be the culprit by sending incorrect TDS packets across the wire.
You may also see errors without a header line. Here is one example that occurred with older versions of SQL Server Management Studio:
When I run this in SSMS 2014 or older versions, I see this:
An error occurred while executing batch. Error message is: Input string was not in a correct format.
This is a bug in SqlClient which is not able to cope with datetimeoffset data in an sql_variant value. You don’t get this particular error in SQLCMD or in the old Query Analyzer. Nor does it appear in SSMS 17.9.1, the current version as I updated this section.
These errors are not particularly common, but it is good to be able to recognise them when you encounter them, so you don’t waste your time with trying to understand what is wrong with your SQL. When it happens, try SQLCMD or OSQL instead and see how they react. If they too are spooky, the issue is down in SQL Server, but if they play well the issue in is SSMS/SqlClient.
Line Numbers in SSMS
Up to SQL 2012, SQL Server Management Studio reported the line number from SQL Server as-is, but starting with SSMS 2014, SSMS now modifies the line number so that refers to a the line number in the query window. Unfortunately, this lead to a major deficiency in SSMS 2014 which has been addressed in SSMS 2016.
Note : «SSMS 2016» is a somewhat inaccurate moniker. Starting with SQL 2016, SSMS is no longer part of the SQL Server distribution as such, but it leads its own life with monthly updates. SSMS is now a free download and you can run SSMS against all versions from SQL 2000 and up (save for connection to older versions of Integration Services.)
To see this difference, consider this script:
In all query tools up to SSMS 2012, the output is:
This is the first batch
This is the second batch
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ‘and it has a syntax error’.
The error is reported to be on line 1, because that is how SQL Server sees the script. (Recall that go is a batch separator that only has a meaning for the query tool, and SQL Server never sees it.) Starting with SSMS 2014, the output is:
This is the first batch
This is the second batch
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ‘and it has a syntax error’.
The line number is now reported with regards to the script, which certainly can be helpful at times. (But since you always can double-click an error message to find where the error is, I don’t find this extremely important.)
In their enthusiasm, Microsoft overlooked the possibility that the error may come from a stored procedure. Consider this script:
The output in SSMS 2014 is:
Msg 220, Level 16, State 2, Procedure CityOfTinyLites, Line 7
Arithmetic overflow error for data type tinyint, value = 800.
This is plain wrong, since there is no line 7 in that procedure. With SSMS 2014, to understand where an error occurred inside a stored procedure, you need to know on which line the batch that includes the EXEC statement starts and then deduct that line number from the line number in the error message and add one to get the line number in the stored procedure. You cannot say that this is very convenient. Thankfully, in SSMS 2016 addresses this, and you get this output:
Msg 220, Level 16, State 2, Procedure CityOfTinyLites, Line 2 [Batch Start Line 5]
Arithmetic overflow error for data type tinyint, value = 800.
The statement has been terminated.
That is, when there is a procedure name in the error message, SSMS 2016 reports the the unmodified line number in the procedure, and it also adds information about where in the window the batch that includes the procedure call started.
Note that there is still is a problem if the error occurs in a batch of dynamic SQL. Consider this silly script:
The output with SSMS 2014 and later is:
Msg 2812, Level 16, State 62, Line 4
Could not find stored procedure ‘Rat’.
Because there is no way for SSMS to tell whether the error occurred in a statement in the query window or in a batch of dynamic SQL (SQL Server does not provide this information), it assumes the former and reports the error message to be on the wrong line. To be fair, error messages from dynamic SQL that occurs in a procedure three levels deep have always been problematic, because you don’t have any context.
I like to point out that what I have said here applies to SSMS only. SQLCMD and other command-line tools do not modify the line number.
Note : With the exception of this section, the output for all examples in this series of articles has been produced with SSMS 2012. Thus, if you are using a later version of SSMS, you may see differences with regards to the line number.
Transaction Basics in SQL Server
Atomic – A transaction should either be performed in whole or not at all.
Consistent – A transaction should take the database from one consistent state to another with regards to constraints and other integrity checks like triggers.
Isolated – The results of an on-going transaction should not be visible to other transactions, and depending on isolation level, the transaction should not see changes performed by other transactions.
Durable – Once completed, the result of the transaction should be persisted and survive server crashes.
A full discussion how all these four properties are implemented in SQL Server is far beyond the scope of this article. Our focus is error handling, but as part of error handling we must understand how we can uphold the ACID principle in case of an error. The most important property is the first one, atomicity. That is, in the very most cases our error handling should make sure that in case of an error the transaction performs nothing at all.
Note : For a longer discussion about ACID as such, see this article in Wikipedia.
In this chapter, I will look the basic concepts and commands for transaction handling in SQL Server. I’m saving more exotic variations to a later chapter.
Auto-Commit
In an ANSI-compliant database, the normal procedure is to start a transaction, perform one or more updates and then commit the transaction whereupon it becomes durable. If you perform an operation and no explicit transaction has been started, the database engine will start an implicit transaction that you need to commit explicitly.
A system transaction can encompass more operations than just the statement itself. One example is an update performed through a cascading constraint. More important for you as a programmer are triggers – triggers always execute in the context of the statement that fired the transaction. This is very logical, since the purpose of a trigger is to uphold the C in ACID, consistency. That is, the trigger is supposed perform validations or cascading updates that cannot be implemented by constraints. A third example is a stored procedure invoked through INSERT-EXEC ; it executes in the context of a transaction defined by the INSERT statement.
User-Defined Transactions
As long as the transaction is open, the updates performed by the transaction are invisible to other processes, unless they use the isolation level READ UNCOMMITTED (a.k.a. NOLOCK ). Readers that use other isolation levels that attempt to access the modified rows will be blocked, or, if they use some form of snapshot isolation, see an older version of the row.
Just like a system transaction, a user-defined transaction can be rolled back. This can happen of three different reasons: