{"id":1084,"date":"2016-05-31T19:49:16","date_gmt":"2016-05-31T12:49:16","guid":{"rendered":"http:\/\/www.sqlitetutorial.net\/?page_id=1084"},"modified":"2022-04-03T15:03:37","modified_gmt":"2022-04-03T08:03:37","slug":"sqlite-transaction","status":"publish","type":"page","link":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/","title":{"rendered":"SQLite Transaction"},"content":{"rendered":"\r\n<p><strong>Summary<\/strong>: in this tutorial, we will show you how to use the SQLite transaction to ensure the integrity and reliability of the data.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">SQLite &amp; ACID<\/h2>\r\n\r\n\r\n\r\n<p>SQLite is a transactional database that all changes and queries are atomic, consistent, isolated, and durable (ACID).<\/p>\r\n\r\n\r\n\r\n<p>SQLite guarantees all the transactions are ACID compliant even if the transaction is interrupted by a program crash, operation system dump, or power failure to the computer.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\"><li><strong>A<\/strong>tomic: a transaction should be atomic. It means that a change cannot be broken down into smaller ones. When you commit a transaction, either the entire transaction is applied or not.<\/li><li><strong>C<\/strong>onsistent: a transaction must ensure to change the database from one valid state to another. When a transaction starts and executes a statement to modify data, the database becomes inconsistent. However, when the transaction is committed or rolled back, it is important that the transaction must keep the database consistent.<\/li><li><strong>I<\/strong>solation: a pending transaction performed by a session must be isolated from other sessions. When a session starts a transaction and executes the <code><a href=\"https:\/\/www.sqlitetutorial.net\/sqlite-insert\/\">INSERT<\/a><\/code> or <code><a href=\"https:\/\/www.sqlitetutorial.net\/sqlite-update\/\">UPDATE<\/a><\/code> statement to change the data, these changes are only visible to the current session, not others. On the other hand, the changes committed by other sessions after the transaction started should not be visible to the current session.<\/li><li>Durable: if a transaction is successfully committed, the changes must be permanent in the database regardless of the condition such as power failure or program crash. On the contrary, if the program crashes before the transaction is committed, the change should not persist.<\/li><\/ul>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">SQLite transaction statements<\/h2>\r\n\r\n\r\n\r\n<p>By default, SQLite operates in auto-commit mode. It means that for each command, SQLite starts, processes, and commits the transaction automatically.<\/p>\r\n\r\n\r\n\r\n<p>To start a transaction explicitly, you use the following steps:<\/p>\r\n\r\n\r\n\r\n<p>First, open a transaction by issuing the <code>BEGIN TRANSACTION<\/code> command.<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">BEGIN<\/span> <span class=\"hljs-keyword\">TRANSACTION<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>After executing the statement <code>BEGIN TRANSACTION<\/code>, the transaction is open until it is explicitly committed or rolled back.<\/p>\r\n\r\n\r\n\r\n<p>Second, issue SQL statements to select or update data in the database. Note that the change is only visible to the current session (or client).<\/p>\r\n\r\n\r\n\r\n<p>Third, commit the changes to the database by using the <code>COMMIT<\/code> or <code>COMMIT TRANSACTION<\/code> statement.<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">COMMIT<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>If you do not want to save the changes, you can roll back using the <code>ROLLBACK<\/code> or <code>ROLLBACK TRANSACTION<\/code> statement:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">ROLLBACK<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<h2 class=\"wp-block-heading\">SQLite transaction example<\/h2>\r\n\r\n\r\n\r\n<p>We will create two new tables: <code>accounts<\/code> and <code>account_changes<\/code> for the demonstration.<\/p>\r\n\r\n\r\n\r\n<p>The <code>accounts<\/code> table stores data about the account numbers and their balances. The <code>account_changes<\/code> table stores the changes of the accounts.<\/p>\r\n\r\n\r\n\r\n<p>First, create the <code>accounts<\/code> and <code>account_changes<\/code> tables by using the following <code><a href=\"https:\/\/www.sqlitetutorial.net\/sqlite-create-table\/\">CREATE TABLE<\/a><\/code> statements:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">CREATE<\/span> <span class=\"hljs-keyword\">TABLE<\/span> accounts ( \r\n\taccount_no <span class=\"hljs-built_in\">INTEGER<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span>, \r\n\tbalance <span class=\"hljs-built_in\">DECIMAL<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span> <span class=\"hljs-keyword\">DEFAULT<\/span> <span class=\"hljs-number\">0<\/span>,\r\n\tPRIMARY <span class=\"hljs-keyword\">KEY<\/span>(account_no),\r\n        <span class=\"hljs-keyword\">CHECK<\/span>(balance &gt;= <span class=\"hljs-number\">0<\/span>)\r\n);\r\n\r\n<span class=\"hljs-keyword\">CREATE<\/span> <span class=\"hljs-keyword\">TABLE<\/span> account_changes (\r\n\tchange_no <span class=\"hljs-built_in\">INT<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span> PRIMARY <span class=\"hljs-keyword\">KEY<\/span>,\r\n\taccount_no <span class=\"hljs-built_in\">INTEGER<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span>, \r\n\tflag <span class=\"hljs-built_in\">TEXT<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span>, \r\n\tamount <span class=\"hljs-built_in\">DECIMAL<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span>, \r\n\tchanged_at <span class=\"hljs-built_in\">TEXT<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span> \r\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>Second, <a href=\"https:\/\/www.sqlitetutorial.net\/sqlite-insert\/\">insert<\/a> some sample data into the <code>accounts<\/code> table.<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">INSERT<\/span> <span class=\"hljs-keyword\">INTO<\/span> accounts (account_no,balance)\r\n<span class=\"hljs-keyword\">VALUES<\/span> (<span class=\"hljs-number\">100<\/span>,<span class=\"hljs-number\">20100<\/span>);\r\n\r\n<span class=\"hljs-keyword\">INSERT<\/span> <span class=\"hljs-keyword\">INTO<\/span> accounts (account_no,balance)\r\n<span class=\"hljs-keyword\">VALUES<\/span> (<span class=\"hljs-number\">200<\/span>,<span class=\"hljs-number\">10100<\/span>);\r\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>Third, query data from the <code>accounts<\/code> table:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> * <span class=\"hljs-keyword\">FROM<\/span> accounts;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"173\" height=\"65\" src=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png\" alt=\"\" class=\"wp-image-1956\"\/><\/figure>\r\n\r\n\r\n\r\n<p>Fourth, transfer 1000 from account 100 to 200, and log the changes to the table <code>account_changes<\/code> in a single transaction.<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">BEGIN<\/span> <span class=\"hljs-keyword\">TRANSACTION<\/span>;\r\n\r\n<span class=\"hljs-keyword\">UPDATE<\/span> accounts\r\n   <span class=\"hljs-keyword\">SET<\/span> balance = balance - <span class=\"hljs-number\">1000<\/span>\r\n <span class=\"hljs-keyword\">WHERE<\/span> account_no = <span class=\"hljs-number\">100<\/span>;\r\n\r\n<span class=\"hljs-keyword\">UPDATE<\/span> accounts\r\n   <span class=\"hljs-keyword\">SET<\/span> balance = balance + <span class=\"hljs-number\">1000<\/span>\r\n <span class=\"hljs-keyword\">WHERE<\/span> account_no = <span class=\"hljs-number\">200<\/span>;\r\n \r\n<span class=\"hljs-keyword\">INSERT<\/span> <span class=\"hljs-keyword\">INTO<\/span> account_changes(account_no,flag,amount,changed_at) \r\n<span class=\"hljs-keyword\">VALUES<\/span>(<span class=\"hljs-number\">100<\/span>,<span class=\"hljs-string\">'-'<\/span>,<span class=\"hljs-number\">1000<\/span>,datetime(<span class=\"hljs-string\">'now'<\/span>));\r\n\r\n<span class=\"hljs-keyword\">INSERT<\/span> <span class=\"hljs-keyword\">INTO<\/span> account_changes(account_no,flag,amount,changed_at) \r\n<span class=\"hljs-keyword\">VALUES<\/span>(<span class=\"hljs-number\">200<\/span>,<span class=\"hljs-string\">'+'<\/span>,<span class=\"hljs-number\">1000<\/span>,datetime(<span class=\"hljs-string\">'now'<\/span>));\r\n\r\n<span class=\"hljs-keyword\">COMMIT<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>Fifth, query data from the <code>accounts<\/code> table:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> * <span class=\"hljs-keyword\">FROM<\/span> accounts;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"174\" height=\"63\" src=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table-after-modifying.png\" alt=\"\" class=\"wp-image-1957\"\/><\/figure>\r\n\r\n\r\n\r\n<p>As you can see, balances have been updated successfully.<\/p>\r\n\r\n\r\n\r\n<p>Sixth, query the contents of the <code>account_changes<\/code> table:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> * <span class=\"hljs-keyword\">FROM<\/span> account_changes;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"443\" height=\"65\" src=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-log-table.png\" alt=\"\" class=\"wp-image-1953\" srcset=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-log-table.png 443w, https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-log-table-300x44.png 300w\" sizes=\"auto, (max-width: 443px) 100vw, 443px\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Let&#8217;s take another example of rolling back a transaction.<\/p>\r\n\r\n\r\n\r\n<p>First, attempt to deduct 20,000 from account 100:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">BEGIN<\/span> <span class=\"hljs-keyword\">TRANSACTION<\/span>;\r\n\r\n<span class=\"hljs-keyword\">UPDATE<\/span> accounts\r\n   <span class=\"hljs-keyword\">SET<\/span> balance = balance - <span class=\"hljs-number\">20000<\/span>\r\n <span class=\"hljs-keyword\">WHERE<\/span> account_no = <span class=\"hljs-number\">100<\/span>;\r\n\r\n<span class=\"hljs-keyword\">INSERT<\/span> <span class=\"hljs-keyword\">INTO<\/span> account_changes(account_no,flag,amount,changed_at) \r\n<span class=\"hljs-keyword\">VALUES<\/span>(<span class=\"hljs-number\">100<\/span>,<span class=\"hljs-string\">'-'<\/span>,<span class=\"hljs-number\">20000<\/span>,datetime(<span class=\"hljs-string\">'now'<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>SQLite issued an error due to not enough balance:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;SQLITE_CONSTRAINT]<\/span>  <span class=\"hljs-selector-tag\">Abort<\/span> <span class=\"hljs-selector-tag\">due<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">constraint<\/span> <span class=\"hljs-selector-tag\">violation<\/span> (<span class=\"hljs-selector-tag\">CHECK<\/span> <span class=\"hljs-selector-tag\">constraint<\/span> <span class=\"hljs-selector-tag\">failed<\/span>: <span class=\"hljs-selector-tag\">accounts<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>However, the log has been saved to the <code>account_changes<\/code> table:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> * <span class=\"hljs-keyword\">FROM<\/span> account_changes;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"80\" src=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-rollback-example.png\" alt=\"\" class=\"wp-image-1954\" srcset=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-rollback-example.png 441w, https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-rollback-example-300x54.png 300w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/figure>\r\n\r\n\r\n\r\n<p>Second, roll back the transaction by using the <code>ROLLBACK<\/code> statement:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">ROLLBACK<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<p>Finally, query data from the <code>account_changes<\/code> table, you will see that the change no #3 is not there anymore:<\/p>\r\n\r\n\r\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-keyword\">SELECT<\/span> * <span class=\"hljs-keyword\">FROM<\/span> account_changes;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"442\" height=\"66\" src=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-rollback-change.png\" alt=\"\" class=\"wp-image-1955\" srcset=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-rollback-change.png 442w, https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-rollback-change-300x45.png 300w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/figure>\r\n\r\n\r\n\r\n<p>In this tutorial, you have learned how to deal with SQLite transactions by using the <code>BEGIN TRANSACTION<\/code>, <code>COMMIT<\/code>, and <code>ROLLBACK<\/code> statements to control the transactions in the SQLite database.<\/p>\r\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1084\"\n\t\t\t\tdata-post-url=\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\"\n\t\t\t\tdata-post-title=\"SQLite Transaction\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1084\"\n\t\t\t\tdata-post-url=\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\"\n\t\t\t\tdata-post-title=\"SQLite Transaction\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you will learn how to deal with SQLite transactions by using the BEGIN TRANSACTION, COMMIT, and ROLLBACK statements to control the transactions in the SQLite database.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2,"menu_order":36,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1084","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SQLite Transaction Explained By Practical Examples<\/title>\n<meta name=\"description\" content=\"Learn how to deal with SQLite transactions by using the BEGIN TRANSACTION, COMMIT, and ROLLBACK statements to control transactions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQLite Transaction Explained By Practical Examples\" \/>\n<meta property=\"og:description\" content=\"Learn how to deal with SQLite transactions by using the BEGIN TRANSACTION, COMMIT, and ROLLBACK statements to control transactions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\" \/>\n<meta property=\"og:site_name\" content=\"SQLite Tutorial\" \/>\n<meta property=\"article:modified_time\" content=\"2022-04-03T08:03:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/#\/schema\/person\/6d69b968cad0102e30d6694ed8dc6427\"},\"headline\":\"SQLite Transaction\",\"datePublished\":\"2016-05-31T12:49:16+00:00\",\"dateModified\":\"2022-04-03T08:03:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\"},\"wordCount\":549,\"image\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png\",\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\",\"url\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\",\"name\":\"SQLite Transaction Explained By Practical Examples\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png\",\"datePublished\":\"2016-05-31T12:49:16+00:00\",\"dateModified\":\"2022-04-03T08:03:37+00:00\",\"description\":\"Learn how to deal with SQLite transactions by using the BEGIN TRANSACTION, COMMIT, and ROLLBACK statements to control transactions.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage\",\"url\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png\",\"contentUrl\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png\",\"width\":173,\"height\":65},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlitetutorial.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQLite Transaction\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/#website\",\"url\":\"https:\/\/www.sqlitetutorial.net\/\",\"name\":\"SQLite Tutorial\",\"description\":\"A Step-by-step SQLite Tutorial\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlitetutorial.net\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/#\/schema\/person\/6d69b968cad0102e30d6694ed8dc6427\",\"name\":\"admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SQLite Transaction Explained By Practical Examples","description":"Learn how to deal with SQLite transactions by using the BEGIN TRANSACTION, COMMIT, and ROLLBACK statements to control transactions.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/","og_locale":"en_US","og_type":"article","og_title":"SQLite Transaction Explained By Practical Examples","og_description":"Learn how to deal with SQLite transactions by using the BEGIN TRANSACTION, COMMIT, and ROLLBACK statements to control transactions.","og_url":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/","og_site_name":"SQLite Tutorial","article_modified_time":"2022-04-03T08:03:37+00:00","og_image":[{"url":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#article","isPartOf":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/"},"author":{"name":"admin","@id":"https:\/\/www.sqlitetutorial.net\/#\/schema\/person\/6d69b968cad0102e30d6694ed8dc6427"},"headline":"SQLite Transaction","datePublished":"2016-05-31T12:49:16+00:00","dateModified":"2022-04-03T08:03:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/"},"wordCount":549,"image":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png","inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/","url":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/","name":"SQLite Transaction Explained By Practical Examples","isPartOf":{"@id":"https:\/\/www.sqlitetutorial.net\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png","datePublished":"2016-05-31T12:49:16+00:00","dateModified":"2022-04-03T08:03:37+00:00","description":"Learn how to deal with SQLite transactions by using the BEGIN TRANSACTION, COMMIT, and ROLLBACK statements to control transactions.","breadcrumb":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#primaryimage","url":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png","contentUrl":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2019\/08\/sqlite-transaction-accounts-table.png","width":173,"height":65},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-transaction\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlitetutorial.net\/"},{"@type":"ListItem","position":2,"name":"SQLite Transaction"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlitetutorial.net\/#website","url":"https:\/\/www.sqlitetutorial.net\/","name":"SQLite Tutorial","description":"A Step-by-step SQLite Tutorial","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlitetutorial.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlitetutorial.net\/#\/schema\/person\/6d69b968cad0102e30d6694ed8dc6427","name":"admin"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages\/1084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/comments?post=1084"}],"version-history":[{"count":1,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages\/1084\/revisions"}],"predecessor-version":[{"id":2792,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages\/1084\/revisions\/2792"}],"up":[{"embeddable":true,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages\/2"}],"wp:attachment":[{"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/media?parent=1084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}