{"id":4104,"date":"2024-10-30T10:21:46","date_gmt":"2024-10-30T03:21:46","guid":{"rendered":"https:\/\/www.sqlitetutorial.net\/?page_id=4104"},"modified":"2024-10-30T10:43:23","modified_gmt":"2024-10-30T03:43:23","slug":"transaction","status":"publish","type":"page","link":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/","title":{"rendered":"SQLite Bun: Transaction"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you will learn how to perform a transaction in an SQLite database using Bun.<\/p>\n\n\n\n<p>Transactions allow you to execute multiple queries such that either all of them succeed or none do. In Bun, you use <code>transaction()<\/code> method of the <code>Database<\/code> object to create a transaction.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creating tables<\/h2>\n\n\n\n<p>Step 1. Open your terminal and navigate to the project directory.<\/p>\n\n\n\n<p>Step 2. Connect to the <code>pub.db<\/code> database using the <code>sqlite3<\/code> shell.<\/p>\n\n\n\n<p>Step 3. Create the <code>books<\/code> and <code>book_authors<\/code> tables:<\/p>\n\n\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\">CREATE<\/span> <span class=\"hljs-keyword\">TABLE<\/span> books (\n   <span class=\"hljs-keyword\">id<\/span> <span class=\"hljs-built_in\">INTEGER<\/span> PRIMARY <span class=\"hljs-keyword\">KEY<\/span>,\n   title <span class=\"hljs-built_in\">TEXT<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span>,\n   isbn <span class=\"hljs-built_in\">TEXT<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span>,\n   publishedYear <span class=\"hljs-built_in\">DATE<\/span> <span class=\"hljs-keyword\">NOT<\/span> <span class=\"hljs-literal\">NULL<\/span>\n);\n\n<span class=\"hljs-keyword\">CREATE<\/span> <span class=\"hljs-keyword\">TABLE<\/span> book_authors(\n   bookId <span class=\"hljs-built_in\">INTEGER<\/span>,\n   authorId <span class=\"hljs-built_in\">INTEGER<\/span>,\n   PRIMARY <span class=\"hljs-keyword\">KEY<\/span>(bookId, authorId),\n   <span class=\"hljs-keyword\">FOREIGN<\/span> <span class=\"hljs-keyword\">KEY<\/span>(bookId) <span class=\"hljs-keyword\">REFERENCES<\/span> books(<span class=\"hljs-keyword\">id<\/span>) <span class=\"hljs-keyword\">ON<\/span> <span class=\"hljs-keyword\">DELETE<\/span> <span class=\"hljs-keyword\">CASCADE<\/span> <span class=\"hljs-keyword\">ON<\/span> <span class=\"hljs-keyword\">UPDATE<\/span> <span class=\"hljs-keyword\">CASCADE<\/span>,\n   <span class=\"hljs-keyword\">FOREIGN<\/span> <span class=\"hljs-keyword\">KEY<\/span>(authorId) <span class=\"hljs-keyword\">REFERENCES<\/span> <span class=\"hljs-keyword\">authors<\/span>(<span class=\"hljs-keyword\">id<\/span>) <span class=\"hljs-keyword\">ON<\/span> <span class=\"hljs-keyword\">DELETE<\/span> <span class=\"hljs-keyword\">CASCADE<\/span> <span class=\"hljs-keyword\">ON<\/span> <span class=\"hljs-keyword\">UPDATE<\/span> <span class=\"hljs-keyword\">CASCADE<\/span>\n);<\/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>\n\n\n<p>Here&#8217;s the updated database diagram:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"204\" src=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png\" alt=\"sqlite bun transaction tables\" class=\"wp-image-4109\" srcset=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png 844w, https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables-300x73.png 300w, https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables-768x186.png 768w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><\/figure>\n\n\n\n<p>Step 4. List all the tables<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\">authors       book_authors  books<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Performing a transaction<\/h2>\n\n\n\n<p>We&#8217;ll insert a new book and assign an author to the book within the <em>same transaction<\/em>.<\/p>\n\n\n\n<p>Step 1. Create a <code>book.ts<\/code> file.<\/p>\n\n\n\n<p>Step 2. Define type <code>ID<\/code> which can be <code>number<\/code> or <code>bigint<\/code> in the <code>book.ts<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">type<\/span> ID = <span class=\"hljs-built_in\">number<\/span> | bigint;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Step 3. Define <code>insertBook<\/code> function that <a href=\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/insert\/\">inserts a new row<\/a> into the <code>books<\/code> table:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">insertBook<\/span>(<span class=\"hljs-params\">\n  db: Database,\n  title: <span class=\"hljs-built_in\">string<\/span>,\n  isbn: <span class=\"hljs-built_in\">string<\/span>,\n  publishedYear: <span class=\"hljs-built_in\">string<\/span>\n<\/span>): <span class=\"hljs-title\">ID<\/span> <\/span>{\n  <span class=\"hljs-keyword\">const<\/span> sql = <span class=\"hljs-string\">`INSERT INTO books(title, isbn, publishedYear) \n               VALUES(:title,:isbn,:publishedYear);`<\/span>;\n  <span class=\"hljs-keyword\">const<\/span> stmt = db.prepare(sql);\n  <span class=\"hljs-keyword\">const<\/span> result = stmt.run({\n    title,\n    isbn,\n    publishedYear,\n  });\n\n  <span class=\"hljs-keyword\">return<\/span> result.lastInsertRowid;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Step 4. Define <code>assignBookToAuthor<\/code> function that inserts a new row into the <code>book_authors<\/code> table:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">assignBookToAuthor<\/span>(<span class=\"hljs-params\">db: Database, bookId: ID, authorId: ID<\/span>) <\/span>{\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">`Assigning book <span class=\"hljs-subst\">${bookId}<\/span> to author <span class=\"hljs-subst\">${authorId}<\/span>`<\/span>);\n\n  <span class=\"hljs-keyword\">const<\/span> sql = <span class=\"hljs-string\">`INSERT INTO book_authors(bookId, authorId) \n               VALUES(:bookId,:authorId);`<\/span>;\n  <span class=\"hljs-keyword\">const<\/span> stmt = db.prepare(sql);\n  stmt.run({\n    bookId,\n    authorId,\n  });\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Step 5. Define the <code>addBook<\/code> function that calls the <code>insertBook<\/code> and <code>assignBookToAuthor<\/code> functions within the same transaction:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">addBook<\/span>(<span class=\"hljs-params\">\n  db: Database,\n  title: <span class=\"hljs-built_in\">string<\/span>,\n  isbn: <span class=\"hljs-built_in\">string<\/span>,\n  publishedYear: <span class=\"hljs-built_in\">string<\/span>,\n  authorId: ID\n<\/span>) <\/span>{\n  <span class=\"hljs-comment\">\/\/ create a new transaction<\/span>\n  <span class=\"hljs-keyword\">const<\/span> start = db.transaction(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\n    <span class=\"hljs-keyword\">const<\/span> bookId = insertBook(db, title, isbn, publishedYear);\n    assignBookToAuthor(db, bookId, authorId);\n  });\n\n  <span class=\"hljs-comment\">\/\/ start the transaction<\/span>\n  start();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, call the transaction method of the <code>Database<\/code> object that wraps a transaction. It returns a function that runs queries within the same transaction:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">const<\/span> start = db.transaction(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Inside the returning function, call the <code>insertBook<\/code> function to insert a new row into the <code>books<\/code> table and <code>assignBookToAuthor<\/code> function to insert a row into the <code>book_authors<\/code> table.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">const<\/span> bookId = insertBook(db, title, isbn, publishedYear);\nassignBookToAuthor(db, bookId, authorId);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, call the <code>add<\/code> function to start the transaction:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\">start();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If the function returns, the transaction is automatically committed. If an exception occurs, the transaction is rolled back. <\/p>\n\n\n\n<p class=\"note\">Note that the exception will not be caught but propagate as usual.<\/p>\n\n\n\n<p>Step 6. Create a new file <code>transaction.ts<\/code> with the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">import<\/span> { Database } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\"bun:sqlite\"<\/span>;\n<span class=\"hljs-keyword\">import<\/span> { addBook } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">\".\/book\"<\/span>;\n\n<span class=\"hljs-keyword\">let<\/span> db;\n\n<span class=\"hljs-keyword\">try<\/span> {\n  <span class=\"hljs-comment\">\/\/ connect to SQLite<\/span>\n  db = <span class=\"hljs-keyword\">new<\/span> Database(<span class=\"hljs-string\">\"pub.db\"<\/span>, { strict: <span class=\"hljs-literal\">true<\/span> });\n\n  <span class=\"hljs-comment\">\/\/ enable foreign key support<\/span>\n  db.exec(<span class=\"hljs-string\">\"PRAGMA foreign_keys = ON\"<\/span>);\n\n  <span class=\"hljs-comment\">\/\/ insert a new book<\/span>\n  addBook(\n    db,\n    <span class=\"hljs-string\">\"SQLite Secret: Adventures in Queryland\"<\/span>,\n    <span class=\"hljs-string\">\"978-1-67890-123-4\"<\/span>,\n    <span class=\"hljs-string\">\"2024\"<\/span>,\n    <span class=\"hljs-number\">100<\/span>\n  );\n} <span class=\"hljs-keyword\">catch<\/span> (error) {\n  <span class=\"hljs-built_in\">console<\/span>.log(error);\n} <span class=\"hljs-keyword\">finally<\/span> {\n  <span class=\"hljs-keyword\">if<\/span> (db) db.close();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, connect to the SQLite database:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">db = <span class=\"hljs-keyword\">new<\/span> Database(<span class=\"hljs-string\">\"pub.db\"<\/span>, { <span class=\"hljs-attr\">strict<\/span>: <span class=\"hljs-literal\">true<\/span> });<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, enable foreign key support:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">db.exec(<span class=\"hljs-string\">\"PRAGMA foreign_keys = ON\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, call the <code>addBook()<\/code> function to add a book and assign an author with id 1:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">addBook(\n    db,\n    <span class=\"hljs-string\">\"SQLite Secret: Adventures in Queryland\"<\/span>,\n    <span class=\"hljs-string\">\"978-1-67890-123-4\"<\/span>,\n    <span class=\"hljs-string\">\"2024\"<\/span>,\n    <span class=\"hljs-number\">100<\/span>\n  );<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, close the database connection:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">if<\/span> (<span class=\"hljs-selector-tag\">db<\/span>) <span class=\"hljs-selector-tag\">db<\/span><span class=\"hljs-selector-class\">.close<\/span>();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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>\n\n\n<p>Step 7. Run the <code>transaction.ts<\/code> file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\">bun transaction.ts<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Step 8. Verify the data in the <code>books<\/code> and <code>book_authors<\/code> tables:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" 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> books;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><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>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\">id  title                                   isbn               publishedYear\n--  --------------------------------------  -----------------  -------------\n<span class=\"hljs-number\">1<\/span>   SQLite Secret: Adventures <span class=\"hljs-keyword\">in<\/span> Queryland  <span class=\"hljs-number\">978<\/span><span class=\"hljs-number\">-1<\/span><span class=\"hljs-number\">-67890<\/span><span class=\"hljs-number\">-123<\/span><span class=\"hljs-number\">-4<\/span>  <span class=\"hljs-number\">2024<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" 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> book_authors;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><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>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"TypeScript\" data-shcb-language-slug=\"typescript\"><span><code class=\"hljs language-typescript\">bookId  authorId\n------  --------\n<span class=\"hljs-number\">1<\/span>       <span class=\"hljs-number\">1<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">TypeScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">typescript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The output indicates that the transaction has been completed successfully.<\/p>\n\n\n\n<p>The transaction will fail if you change the author ID to a non-existing one such as <code>100<\/code>. The app will not insert any row into the <code>books<\/code> or <code>book_authors<\/code> tables.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Call the <code>transaction()<\/code> method of the <code>Database<\/code> object to return a function that wraps multiple queries executing within a transaction.<\/li>\n<\/ul>\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=\"4104\"\n\t\t\t\tdata-post-url=\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\"\n\t\t\t\tdata-post-title=\"SQLite Bun: 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=\"4104\"\n\t\t\t\tdata-post-url=\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\"\n\t\t\t\tdata-post-title=\"SQLite Bun: 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>Summary: in this tutorial, you will learn how to perform a transaction in an SQLite database using Bun. Transactions allow you to execute multiple queries such that either all of them succeed or none do. In Bun, you use transaction() method of the Database object to create a transaction. Creating tables Step 1. Open your [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":3739,"menu_order":7,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4104","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 Bun: Transaction<\/title>\n<meta name=\"description\" content=\"In this tutorial, you will learn how to perform a transaction in an SQLite database using Bun.\" \/>\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-bun\/transaction\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQLite Bun: Transaction\" \/>\n<meta property=\"og:description\" content=\"In this tutorial, you will learn how to perform a transaction in an SQLite database using Bun.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\" \/>\n<meta property=\"og:site_name\" content=\"SQLite Tutorial\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-30T03:43:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.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=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/#\/schema\/person\/6d69b968cad0102e30d6694ed8dc6427\"},\"headline\":\"SQLite Bun: Transaction\",\"datePublished\":\"2024-10-30T03:21:46+00:00\",\"dateModified\":\"2024-10-30T03:43:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\"},\"wordCount\":354,\"image\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png\",\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\",\"url\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\",\"name\":\"SQLite Bun: Transaction\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png\",\"datePublished\":\"2024-10-30T03:21:46+00:00\",\"dateModified\":\"2024-10-30T03:43:23+00:00\",\"description\":\"In this tutorial, you will learn how to perform a transaction in an SQLite database using Bun.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage\",\"url\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png\",\"contentUrl\":\"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png\",\"width\":844,\"height\":204,\"caption\":\"sqlite bun transaction tables\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlitetutorial.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQLite Bun\",\"item\":\"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"SQLite Bun: 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 Bun: Transaction","description":"In this tutorial, you will learn how to perform a transaction in an SQLite database using Bun.","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-bun\/transaction\/","og_locale":"en_US","og_type":"article","og_title":"SQLite Bun: Transaction","og_description":"In this tutorial, you will learn how to perform a transaction in an SQLite database using Bun.","og_url":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/","og_site_name":"SQLite Tutorial","article_modified_time":"2024-10-30T03:43:23+00:00","og_image":[{"url":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#article","isPartOf":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/"},"author":{"name":"admin","@id":"https:\/\/www.sqlitetutorial.net\/#\/schema\/person\/6d69b968cad0102e30d6694ed8dc6427"},"headline":"SQLite Bun: Transaction","datePublished":"2024-10-30T03:21:46+00:00","dateModified":"2024-10-30T03:43:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/"},"wordCount":354,"image":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png","inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/","url":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/","name":"SQLite Bun: Transaction","isPartOf":{"@id":"https:\/\/www.sqlitetutorial.net\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png","datePublished":"2024-10-30T03:21:46+00:00","dateModified":"2024-10-30T03:43:23+00:00","description":"In this tutorial, you will learn how to perform a transaction in an SQLite database using Bun.","breadcrumb":{"@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#primaryimage","url":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png","contentUrl":"https:\/\/www.sqlitetutorial.net\/wp-content\/uploads\/2024\/10\/sqlite-bun-transaction-tables.png","width":844,"height":204,"caption":"sqlite bun transaction tables"},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/transaction\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlitetutorial.net\/"},{"@type":"ListItem","position":2,"name":"SQLite Bun","item":"https:\/\/www.sqlitetutorial.net\/sqlite-bun\/"},{"@type":"ListItem","position":3,"name":"SQLite Bun: 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\/4104","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=4104"}],"version-history":[{"count":5,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages\/4104\/revisions"}],"predecessor-version":[{"id":4117,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages\/4104\/revisions\/4117"}],"up":[{"embeddable":true,"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/pages\/3739"}],"wp:attachment":[{"href":"https:\/\/www.sqlitetutorial.net\/wp-json\/wp\/v2\/media?parent=4104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}