{"title":"Transaksi basisdata","version":"6.1","locale":"id","docname":"topics/db/transactions","url":"/id/6.1/topics/db/transactions/","canonical":"https://djangodocs.dev/id/6.1/topics/db/transactions/","summary":"Django memberikan anda sedikit cara mengendalikan bagaimana transaksi basisdata dikelola.","html":"<span id=\"database-transactions\"></span><h1>Transaksi basisdata<a class=\"heading-anchor\" href=\"#module-django.db.transaction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django memberikan anda sedikit cara mengendalikan bagaimana transaksi basisdata dikelola.</p>\n<section id=\"managing-database-transactions\">\n<h2>Mengelola transaksi basisdata<a class=\"heading-anchor\" href=\"#managing-database-transactions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"django-s-default-transaction-behavior\">\n<h3>Kebiasaan transaksi awal Django<a class=\"heading-anchor\" href=\"#django-s-default-transaction-behavior\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Kebiasaan awal Django adalah menjalankan suasana penyeraahn otomatis. Setiap query segera diserahkan ke basisdata, meskipun transaksi adalah aktif. <a class=\"reference internal\" href=\"#autocommit-details\"><span class=\"std std-ref\">Lihat dibawah ini untuk rincian</span></a>.</p>\n<p>Django menggunakan transaksi atau titiksimpan otomatis untuk menjamin kesatuan dari operasi ORM yang membutuhkan banyak query, khususnya query <a class=\"reference internal\" href=\"/id/6.1/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">delete()</span></a> dan <a class=\"reference internal\" href=\"/id/6.1/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">update()</span></a>.</p>\n<p>Kelas <a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">TestCase</code></a> Django juga membungkus setiap percobaan dalam sebuah transaksi untuk alasan penampilan.</p>\n</section>\n<section id=\"tying-transactions-to-http-requests\">\n<span id=\"id1\"></span><h3>Mengikat transaksi pada permintaan HTTP<a class=\"heading-anchor\" href=\"#tying-transactions-to-http-requests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Cara umum untuk menangani transaksi di jaringan adalah membungkus setiap permintaan di transaksi. Setel <a class=\"reference internal\" href=\"/id/6.1/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\">ATOMIC_REQUESTS</code></a> ke <code class=\"docutils literal notranslate\">True</code> di konfigurasi dari setiap basisdata untuk anda ingin adakan kebiasaan ini.</p>\n<p>Itu bekerja seperti ini. Sebelum memanggil fungsi tampilan, Django memulai sebuah transaksi. Jika tanggapan adalah dihasilkan tanpa masalah, Django melakukan transaksi. Jika tampilan menghasilkan sebuah pengecualian, Django memutar kembali transaksi.</p>\n<p>Anda dapat melakukan subtransaksi menggunakan savepoint dalam kode tampilan anda. khususnya dengan pengelola konteks <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a>. Bagaimanapun, pada akhir tampilan, baik semua tau tidak satupun perubahan akan di jalankan.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Selagi kesederhanaan dari model transaksi ini menarik, itu juga membuat itu tidak efesien ketika lalu lintas menarik. Membuka sebuah transaksi untuk setiap tampilan dan beberapa overhead. Dampak pada penampilan bergantingan pada pola permintaan dari aplikasi anda dan pada sebagaimana baik penanganan basisdata anda mengunci.</p>\n</aside>\n<aside class=\"admonition-per-request-transactions-and-streaming-responses admonition\" role=\"note\">\n<p class=\"admonition-title\">Transaksi per-permintaan dan mengalirkan tanggapan</p>\n<p>Ketika tampilan mengembalikan sebuah <a class=\"reference internal\" href=\"/id/6.1/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">StreamingHttpResponse</code></a>, membaca isi dari tanggapan akan sering menjalankan kode untuk membangkitkan isi. Sejak tampilan telah dikembalikan, kode seperti itu berjalan diluar transaksi.</p>\n<p>Secara umum, itu tidak disarankan menulis ke basisdata selagi membangkitkan aliran tanggapan, sejak tidak ada cara sepaham menangani kesalahan setelah mulai mengirim tanggapan.</p>\n</aside>\n<p>Dalam praktiknya, fitur ini membungkus setiap fungsi tampilan dalam <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> penghias digambarkan dibawah.</p>\n<p>Catat bahwa hanya penjalanan dari tampilan anda terlampir dalam transaksi, Middleware berjalan diluar transaksi, dan begitu juga membangun tanggapan-tanggapan cetakan.</p>\n<p>Ketika <a class=\"reference internal\" href=\"/id/6.1/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\">ATOMIC_REQUESTS</code></a> diadakan, itu masih memungkinkan mencegah tampilan dari berjalan dalam sebuah transaksi.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.non_atomic_requests\">\n<span class=\"sig-name descname\">non_atomic_requests</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.non_atomic_requests\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Penghias ini akan meniadakan pengaruh dari <a class=\"reference internal\" href=\"/id/6.1/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\">ATOMIC_REQUESTS</code></a> untuk tampilan yang diberikan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> transaction\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span>non_atomic_requests\n<span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    do_stuff<span class=\"p\">()</span>\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span>non_atomic_requests<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;other&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_other_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    do_stuff_on_the_other_database<span class=\"p\">()</span>\n</code></pre></div>\n<p>Itu hanya bekerja jika itu diberlakukan ke tampilan itu sendiri.</p>\n</dd></dl>\n\n</section>\n<section id=\"controlling-transactions-explicitly\">\n<h3>Mengendalikan transaksi secara eksplisit<a class=\"heading-anchor\" href=\"#controlling-transactions-explicitly\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django menyediakan API tunggal untuk mengendalikan transaksi basisdata.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.atomic\">\n<span class=\"sig-name descname\">atomic</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">savepoint<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">durable<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.atomic\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Atomicity adalah penentuan sifat dari transaksi basisdata. <code class=\"docutils literal notranslate\">atomic</code> mengizinkan kamu membuat blok dari kode dalam yang atomicity pada basisdata dijaminkan. Jika blok dari kode berhasil lengkap, perubahan di perlakukan ke basisdata. Jika ada sebuah pengecualian, perubahan diputar kembali.</p>\n<p>Blok <code class=\"docutils literal notranslate\">atomic</code> dapat bersarang. Dalam kasus ini, ketika sebuah blok sebelah dalam berhasil terpenuhi, pengaruhnya dapat masih di rollback jika sebuah pengecualian dimunculkan di blok sebelah luar pada titik kemudian.</p>\n<p>It is sometimes useful to ensure an <code class=\"docutils literal notranslate\">atomic</code> block is always the\noutermost <code class=\"docutils literal notranslate\">atomic</code> block, ensuring that any database changes are\ncommitted when the block is exited without errors. This is known as\ndurability and can be achieved by setting <code class=\"docutils literal notranslate\">durable=True</code>. If the\n<code class=\"docutils literal notranslate\">atomic</code> block is nested within another it raises a <code class=\"docutils literal notranslate\">RuntimeError</code>.</p>\n<p><code class=\"docutils literal notranslate\">atomic</code> is usable both as a <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-decorator\" title=\"(di Python v3.14)\"><span class=\"xref std std-term\">decorator</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> transaction\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span>atomic\n<span class=\"k\">def</span> <span class=\"nf\">viewfunc</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># This code executes inside a transaction.</span>\n    do_stuff<span class=\"p\">()</span>\n</code></pre></div>\n<p>and as a <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-context-manager\" title=\"(di Python v3.14)\"><span class=\"xref std std-term\">context manager</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> transaction\n\n\n<span class=\"k\">def</span> <span class=\"nf\">viewfunc</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># This code executes in autocommit mode (Django&#39;s default).</span>\n    do_stuff<span class=\"p\">()</span>\n\n    <span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>\n        <span class=\"c1\"># This code executes inside a transaction.</span>\n        do_more_stuff<span class=\"p\">()</span>\n</code></pre></div>\n<p>Membungkus <code class=\"docutils literal notranslate\">atomic</code> dalam sebuah blok try/except mengizinkan untuk penanganan alami dari kesalahan keutuhan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> IntegrityError<span class=\"p\">,</span> transaction\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span>atomic\n<span class=\"k\">def</span> <span class=\"nf\">viewfunc</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    create_parent<span class=\"p\">()</span>\n\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>\n            generate_relationships<span class=\"p\">()</span>\n    <span class=\"k\">except</span> IntegrityError<span class=\"p\">:</span>\n        handle_exception<span class=\"p\">()</span>\n\n    add_children<span class=\"p\">()</span>\n</code></pre></div>\n<p>In this example, even if <code class=\"docutils literal notranslate\">generate_relationships()</code> causes a database\nerror by breaking an integrity constraint, you can execute queries in\n<code class=\"docutils literal notranslate\">add_children()</code>, and the changes from <code class=\"docutils literal notranslate\">create_parent()</code> are still\nthere and bound to the same transaction. Note that any operations attempted\nin <code class=\"docutils literal notranslate\">generate_relationships()</code> will already have been rolled back safely\nwhen <code class=\"docutils literal notranslate\">handle_exception()</code> is called, so the exception handler can also\noperate on the database if necessary.</p>\n<aside class=\"admonition-avoid-catching-exceptions-inside-atomic admonition\" role=\"note\">\n<p class=\"admonition-title\">Menghindari menangkap pengecualian didalam <code class=\"docutils literal notranslate\">atomic</code>!</p>\n<p>Ketika mengeluarkan sebuah blok <code class=\"docutils literal notranslate\">atomic</code>, Django mencari apakah itu keluar secara biasa atau dengan sebuah pengecualian untuk menentukan apakah memperlakukan atau memutar kembali. Jika anda menangkap dan menangani pengecualian didalam blok <code class=\"docutils literal notranslate\">atomic</code>, anda mungkin bersembunyi dari Django kenyataan bahwa masalah telah terjadi. Ini dapat menghasilkan perilaku tidak diharapkan.</p>\n<p>Ini kebanyakan perhatian untuk <a class=\"reference internal\" href=\"/id/6.1/ref/exceptions/#django.db.DatabaseError\" title=\"django.db.DatabaseError\"><code class=\"xref py py-exc docutils literal notranslate\">DatabaseError</code></a> dan subkelas-subkelas nya seperti <a class=\"reference internal\" href=\"/id/6.1/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\">IntegrityError</code></a>. Setelah kesalahan tersebut, transaksi rusak dan Django akan melakukan memutar kembali pada akhir dari blok <code class=\"docutils literal notranslate\">atomic</code>. Jika anda berusaha menjalankan permintaan basisdata sebalum memutar kembali terjadi, Django akan memunculkan sebuah <a class=\"reference internal\" href=\"/id/6.1/ref/exceptions/#django.db.transaction.TransactionManagementError\" title=\"django.db.transaction.TransactionManagementError\"><code class=\"xref py py-class docutils literal notranslate\">TransactionManagementError</code></a>. Anda mungkin juga menghadapi perilaku ini ketika sinyal terkait-ORM memunculkan sebuah pengecualian.</p>\n<p>Cara benar untuk menangkap kesalahan-kesalahan basisdata disekitar sebuah blok <code class=\"docutils literal notranslate\">atomic</code> seperti ditunjukkan diatas. Jika dibutuhkan, tambah sebuah blok <code class=\"docutils literal notranslate\">atomic</code> tambahan untuk tujuan ini. Pola ini mempunyai keuntungan lain: itu membatasi jelas tindakan-tindakan maan akan diputar kembali jika sebuah pengecualian muncul.</p>\n<p>Jika anda menangkap pengecualian dimunculkan oleh permintaan SQL mentah, perilaku Django tidak ditentukan dan tergantung-basisdata.</p>\n</aside>\n<aside class=\"admonition-you-may-need-to-manually-revert-app-state-when-rolling-back-a-transaction admonition\" role=\"note\">\n<p class=\"admonition-title\">You may need to manually revert app state when rolling back a transaction.</p>\n<p>Nilai-nilai dari bidang-bidang model tidak akan dirubah ketika transaksi memutar kembali terjadi. Ini dapat membawa pada keadaan model tidak tetap meskipun anda secara manual menyimpan kembali nilai-nilai bidang asli.</p>\n<p>Sebagai contoh, diberikan <code class=\"docutils literal notranslate\">MyModel</code> dengan sebuah bidang <code class=\"docutils literal notranslate\">active</code>, potongan ini memastikan bahwa <code class=\"docutils literal notranslate\">if obj.active</code> memeriksa pada akhir penggunaan nilai benar jika memperbaharui <code class=\"docutils literal notranslate\">active</code> menjadi <code class=\"docutils literal notranslate\">True</code> gagal dalam transaksi:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> DatabaseError<span class=\"p\">,</span> transaction\n\nobj <span class=\"o\">=</span> MyModel<span class=\"p\">(</span>active<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\nobj<span class=\"o\">.</span>active <span class=\"o\">=</span> <span class=\"kc\">True</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>\n        obj<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"k\">except</span> DatabaseError<span class=\"p\">:</span>\n    obj<span class=\"o\">.</span>active <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n<span class=\"k\">if</span> obj<span class=\"o\">.</span>active<span class=\"p\">:</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>This also applies to any other mechanism that may hold app state, such\nas caching or global variables. For example, if the code proactively\nupdates data in the cache after saving an object, it's recommended to\nuse <a class=\"reference internal\" href=\"#performing-actions-after-commit\"><span class=\"std std-ref\">transaction.on_commit()</span></a>\ninstead, to defer cache alterations until the transaction is actually\ncommitted.</p>\n</aside>\n<p>Untuk menjamin atomicity, <code class=\"docutils literal notranslate\">atomic</code> meniadakan beberapa API. Berusaha memperlakukan, memutar kembali, atau merubah keadaan penjalanan otomatis dari hubungan basisdata dalam sebuah blok <code class=\"docutils literal notranslate\">atomic</code> akan memunculkan sebuah pengecualian.</p>\n<p><code class=\"docutils literal notranslate\">atomic</code> mengambil sebuah argumen <code class=\"docutils literal notranslate\">using</code> yang harus berupa nama dari basisdata. Jika argumen ini tidak disediakan, Django menggunakan basisdata <code class=\"docutils literal notranslate\">&quot;default&quot;</code>.</p>\n<p>Dibawah tenda, kode pengelolaan transaksi Django:</p>\n<ul class=\"simple\">\n<li><p>membuka sebuah transaksi ketika memasukkan blok <code class=\"docutils literal notranslate\">atomic</code> paling luar;</p></li>\n<li><p>membuat titik simpan ketika memasukkan blok <code class=\"docutils literal notranslate\">atomic</code> sebelah dalam;</p></li>\n<li><p>melepaskan atau digulung kembali ke titik simpan ketika keluar blok paling dalam;</p></li>\n<li><p>menyerahkan atau gulung kembali transaksi ketika keluar blok paling luar</p></li>\n</ul>\n<p>Anda dapat meniadakan pembuatan dari titik simpan untuk blok sebelah dalam dengan mengatur argumen <code class=\"docutils literal notranslate\">savepoint</code> ke <code class=\"docutils literal notranslate\">False</code>. Jika sebuah pengecualian muncul, Django akan melakukan gulunh kembali ketika keluar blok induk pertama dengan sebuah titik simpan jika ada, dan blok paling luar jika tidak. Atomicity masih dijamin oleh transaksi paling luar. Pilihan ini harus hanya digunakan jika kelebihan dari titik simpan dapat dilihat. Itu mempunyai kekurangan dari memecahkan penanganan kesalahan yang digambarkan diatas.</p>\n<p>Anda dapat menggunakan <code class=\"docutils literal notranslate\">atomic</code> ketika penyerahan otomatis dimatikan. Itu akan hanya menggunakan titik simpan, bahkan untuk blok paling luar.</p>\n</dd></dl>\n\n<aside class=\"admonition-performance-considerations admonition\" role=\"note\">\n<p class=\"admonition-title\">Pertimbangan penampilan</p>\n<p>Transaksi-transaksi terbuka mempunyai biaya penampilan untuk peladen basisdata anda. Untuk meminimalkan overhead ini, jaga transaksi-transaksi anda sependek mungkin. Ini adalah khususnya penting jika anda sedang menggunakan <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> dalamn pengolahan berjalan-panjang, diluar permintaan Django / siklus tanggapan.</p>\n</aside>\n</section>\n</section>\n<section id=\"autocommit\">\n<h2>Penyerahan otomatis<a class=\"heading-anchor\" href=\"#autocommit\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"why-django-uses-autocommit\">\n<span id=\"autocommit-details\"></span><h3>Kenapa Django menggunakan penyerahan otomatis<a class=\"heading-anchor\" href=\"#why-django-uses-autocommit\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Dalam standar SQL, setiap permintaan SQL memulai sebuah transaksi, meskipun satu sudah aktif. Transaksi tersebut harus secara eksplisit diserahkan dan digulung kembali.</p>\n<p>Ini tidak selalu mudah untuk pengembang aplikasi. Untuk meredakan masalah ini, kebanyakan basisdata menyediakan sebuah suasana penyerahan otomatis. Ketika penyerahan otomatis dinayalan dan tidak ada transaksi aktif, setiap permintaan SQL dibungkus dalam transaksinya sendiri. Dengan kata lain, bukan hanya melakukan setiap permintaan tersebut mulai sebuah transaksi, tetapi transaksi juga mendapatkan otomatis diserahkan atau digulung kembali, tergandunt pada apakah permintaan berhasil.</p>\n<p><span class=\"target\" id=\"index-5\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a>, Spesifikasi API Basisdata Python v2.0, membutuhkan penjalanan otomatis untuk diawalkan dimatikan. Django menimpa awalan ini dan menyalakan penjalanan otomatis.</p>\n<p>Untuk menghindari ini, anda dapat  <a class=\"reference internal\" href=\"#deactivate-transaction-management\"><span class=\"std std-ref\">menonaktifkan pengelolaan transaksi</span></a>, tetapi itu sangat tidak dianjurkan.</p>\n</section>\n<section id=\"deactivating-transaction-management\">\n<span id=\"deactivate-transaction-management\"></span><h3>Menonaktifkan pengelolaan transaksi<a class=\"heading-anchor\" href=\"#deactivating-transaction-management\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Anda dapat sama sekali meniadakan pengelolaan transaksi Django untuk basis data diberikan dengan mengatur <code class=\"xref std std-setting docutils literal notranslate\">AUTOCOMMIT 1</code> menjadi <code class=\"docutils literal notranslate\">False</code> dalam konfigurasinya. Jika anda melakukan ini, Django tidak akan mengadakan autocommit, dan tidak akan melakukan penjalanan apapun. Anda akan mendapatkan perilaku biasa dari pustaka basisdata pokok.</p>\n<p>Ini membutuhkan anda untuk menyerahkan secara eksplisit setiap transaksi, bahkan yang dimulai oleh Django atau oleh pustaka pihak ketiga. Jadi, ini adalah penggunaan terbaik dalam keadaan dimana anda ingin menjalankan middleware pengendalian transaksi milik anda atau melakukan sesuatu yang sangat aneh.</p>\n</section>\n</section>\n<section id=\"performing-actions-after-commit\">\n<span id=\"id2\"></span><h2>Melakukan tindakan setelah penyerahan<a class=\"heading-anchor\" href=\"#performing-actions-after-commit\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sometimes you need to perform an action related to the current database\ntransaction, but only if the transaction successfully commits. Examples might\ninclude a background task, an email notification, or a cache invalidation.</p>\n<p><a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a> allows you to register callbacks that will be executed after\nthe open transaction is successfully committed:</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.on_commit\">\n<span class=\"sig-name descname\">on_commit</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">func</em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">robust<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.on_commit\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Pass a function, or any callable, to <a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> transaction\n\n\n<span class=\"k\">def</span> <span class=\"nf\">send_welcome_email</span><span class=\"p\">():</span> <span class=\"o\">...</span>\n\n\ntransaction<span class=\"o\">.</span>on_commit<span class=\"p\">(</span>send_welcome_email<span class=\"p\">)</span>\n</code></pre></div>\n<p>Callbacks will not be passed any arguments, but you can bind them with\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.partial\" title=\"(di Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">functools.partial()</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">functools</span> <span class=\"kn\">import</span> partial\n\n<span class=\"k\">for</span> user <span class=\"ow\">in</span> users<span class=\"p\">:</span>\n    transaction<span class=\"o\">.</span>on_commit<span class=\"p\">(</span>partial<span class=\"p\">(</span>send_invite_email<span class=\"p\">,</span> user<span class=\"o\">=</span>user<span class=\"p\">))</span>\n</code></pre></div>\n<p>Callbacks are called after the open transaction is successfully committed. If\nthe transaction is instead rolled back (typically when an unhandled exception\nis raised in an <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> block), the callback will be discarded, and\nnever called.</p>\n<p>If you call <code class=\"docutils literal notranslate\">on_commit()</code> while there isn't an open transaction,\nthe callback will be executed immediately.</p>\n<p>It's sometimes useful to register callbacks that can fail. Passing\n<code class=\"docutils literal notranslate\">robust=True</code> allows the next callbacks to be executed even if the current\none throws an exception. All errors derived from Python's <code class=\"docutils literal notranslate\">Exception</code> class\nare caught and logged to the <code class=\"docutils literal notranslate\">django.db.backends.base</code> logger.</p>\n<p>You can use <a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TestCase.captureOnCommitCallbacks\" title=\"django.test.TestCase.captureOnCommitCallbacks\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.captureOnCommitCallbacks()</code></a> to test callbacks\nregistered with <a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a>.</p>\n<section id=\"savepoints\">\n<h3>Savepoint<a class=\"heading-anchor\" href=\"#savepoints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Titik simpan (yaitu blok  <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> bersarang) ditangani dengan benar. Yaitu, sebuah <a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a> callable terdaftar setelah sebuah titik simpan (dalam blok  <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> bersarang) akan dipanggil setelah transaksi paling luar diserahkan, tetapi tidak jika disimpan kembali ke titik simpan tersebut atau titik simpan sebelumnya yang muncul selama transaksi:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>  <span class=\"c1\"># Outer atomic, start a new transaction</span>\n    transaction<span class=\"o\">.</span>on_commit<span class=\"p\">(</span>foo<span class=\"p\">)</span>\n\n    <span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>  <span class=\"c1\"># Inner atomic block, create a savepoint</span>\n        transaction<span class=\"o\">.</span>on_commit<span class=\"p\">(</span>bar<span class=\"p\">)</span>\n\n<span class=\"c1\"># foo() and then bar() will be called when leaving the outermost block</span>\n</code></pre></div>\n<p>Pada sisi lain, ketika sebuah titik simpan disimpan kembali (karena sebuah pengecualian telah dimunculkan), sebe;ah dalam dapat dipanggil tidak akan dipanggil:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>  <span class=\"c1\"># Outer atomic, start a new transaction</span>\n    transaction<span class=\"o\">.</span>on_commit<span class=\"p\">(</span>foo<span class=\"p\">)</span>\n\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>  <span class=\"c1\"># Inner atomic block, create a savepoint</span>\n            transaction<span class=\"o\">.</span>on_commit<span class=\"p\">(</span>bar<span class=\"p\">)</span>\n            <span class=\"k\">raise</span> SomeError<span class=\"p\">()</span>  <span class=\"c1\"># Raising an exception - abort the savepoint</span>\n    <span class=\"k\">except</span> SomeError<span class=\"p\">:</span>\n        <span class=\"k\">pass</span>\n\n<span class=\"c1\"># foo() will be called, but not bar()</span>\n</code></pre></div>\n</section>\n<section id=\"order-of-execution\">\n<h3>Urutan pelaksanaan<a class=\"heading-anchor\" href=\"#order-of-execution\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>On-commit functions for a given transaction are executed in the order they were\nregistered.</p>\n</section>\n<section id=\"exception-handling\">\n<h3>Penanganan pengecualian<a class=\"heading-anchor\" href=\"#exception-handling\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If one on-commit function registered with <code class=\"docutils literal notranslate\">robust=False</code> within a given\ntransaction raises an uncaught exception, no later registered functions in that\nsame transaction will run. This is the same behavior as if you'd executed the\nfunctions sequentially yourself without <a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a>.</p>\n</section>\n<section id=\"timing-of-execution\">\n<h3>Waktu pelaksanaan<a class=\"heading-anchor\" href=\"#timing-of-execution\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Your callbacks are executed <em>after</em> a successful commit, so a failure in a\ncallback will not cause the transaction to roll back. They are executed\nconditionally upon the success of the transaction, but they are not <em>part</em> of\nthe transaction. For the intended use cases (mail notifications, background\ntasks, etc.), this should be fine. If it's not (if your follow-up action is so\ncritical that its failure should mean the failure of the transaction itself),\nthen you don't want to use the <a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a> hook. Instead, you may want\n<a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Two-phase_commit_protocol\">two-phase commit</a> such as the <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/basic/transactions.html#two-phase-commit\" title=\"(dalam psycopg)\"><span class=\"xref std std-ref\">psycopg Two-Phase Commit protocol support</span></a> and the <span class=\"target\" id=\"index-1\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/#optional-two-phase-commit-extensions\"><strong>optional Two-Phase Commit Extensions\nin the Python DB-API specification</strong></a>.</p>\n<p>Callback tidak berjalan sampai perbaikan otomatis dipulihkan pada hubungan perbaikan berikut (karena sebaliknya apapun permintaan selesai dalam sebuah callback akan membuka sebuah transaksi tersirat, mencegah hubungan dari kembali kedalam suasana perbaikan otomatis).</p>\n<p>Ketika dalam suasana penjalan otomatis dan diluar dari blok <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a>, fungsi akan berjalan segera tidak pada penjalanan.</p>\n<p>On-commit functions only work with <a class=\"reference internal\" href=\"#managing-autocommit\"><span class=\"std std-ref\">autocommit mode</span></a>\nand the <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> (or <a class=\"reference internal\" href=\"/id/6.1/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\">ATOMIC_REQUESTS</code></a>) transaction API. Calling <a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a> when\nautocommit is disabled and you are not within an atomic block will result in an\nerror.</p>\n</section>\n<section id=\"use-in-tests\">\n<h3>Digunakan dalam percobaan<a class=\"heading-anchor\" href=\"#use-in-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django's <a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">TestCase</code></a> class wraps each test in a transaction\nand rolls back that transaction after each test, in order to provide test\nisolation. This means that no transaction is ever actually committed, thus your\n<a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a> callbacks will never be run.</p>\n<p>You can overcome this limitation by using\n<a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TestCase.captureOnCommitCallbacks\" title=\"django.test.TestCase.captureOnCommitCallbacks\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.captureOnCommitCallbacks()</code></a>. This captures your\n<a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a> callbacks in a list, allowing you to make assertions on them,\nor emulate the transaction committing by calling them.</p>\n<p>Another way to overcome the limitation is to use\n<a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\">TransactionTestCase</code></a> instead of\n<a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">TestCase</code></a>. This will mean your transactions are committed,\nand the callbacks will run. However\n<a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\">TransactionTestCase</code></a> flushes the database between tests,\nwhich is significantly slower than <a class=\"reference internal\" href=\"/id/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">TestCase</code></a>'s isolation.</p>\n</section>\n<section id=\"why-no-rollback-hook\">\n<h3>Why no rollback hook?<a class=\"heading-anchor\" href=\"#why-no-rollback-hook\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A rollback hook is harder to implement robustly than a commit hook, since a\nvariety of things can cause an implicit rollback.</p>\n<p>Sebagai contoh, jika hubungan basisdata anda jatuh karena pengolahan anda mati tanpa kesempatan dimatikan dengan anggun, hubungan memutar kembali anda tidak pernah berjalan,</p>\n<p>But there is a solution: instead of doing something during the atomic block\n(transaction) and then undoing it if the transaction fails, use\n<a class=\"reference internal\" href=\"#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">on_commit()</code></a> to delay doing it in the first place until after the\ntransaction succeeds. It's a lot easier to undo something you never did in the\nfirst place!</p>\n</section>\n</section>\n<section id=\"low-level-apis\">\n<h2>API tingkat-rendah<a class=\"heading-anchor\" href=\"#low-level-apis\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Selalu memilih <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> jika memungkan sama sekali. Itu menghitung untuk keanehan dari setiap basisdata dan mecegah tindakan-tindakan tidak sah.</p>\n<p>API tingkat rendah hanya berguna jika anda sedang menerapkan pengelolaan transaksi anda sendiri.</p>\n</aside>\n<section id=\"managing-autocommit\">\n<span id=\"id3\"></span><h3>Penyerahan otomatis<a class=\"heading-anchor\" href=\"#managing-autocommit\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django provides an API in the <a class=\"reference internal\" href=\"#module-django.db.transaction\" title=\"django.db.transaction\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.transaction</code></a> module to manage the\nautocommit state of each database connection.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.get_autocommit\">\n<span class=\"sig-name descname\">get_autocommit</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.get_autocommit\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.set_autocommit\">\n<span class=\"sig-name descname\">set_autocommit</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">autocommit</em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.set_autocommit\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Fungsi-fungsi ini mengambil sebuah argumen <code class=\"docutils literal notranslate\">using</code> yang harus berupa nama dari basisdata. Jika itu tidak disediakan, Django menggunakan basisdata <code class=\"docutils literal notranslate\">&quot;default&quot;</code>.</p>\n<p>Autocommit awalannya dinyalakan. Jika anda mematikan itu, itu adalah tanggungjawab anda menyimpan itu kembali.</p>\n<p>Sekali anda mematikan autocommit, anda mendapatkan perilaku awalan dari penyadur basisdata anda, dan Django tidak akan membantu anda. Meskipun perilaku itu adalah ditentukan dalam <span class=\"target\" id=\"index-6\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a>, penerapan dari penyadur tidak selalu konsisten dengan satu lainnya. Tinjau kembali dari penyadur anda sedang gunakan secara hati-hati.</p>\n<p>Anda harus memastikan bahwa tidak ada transaksi aktif, biasanya dengan menerbitkan <a class=\"reference internal\" href=\"#django.db.transaction.commit\" title=\"django.db.transaction.commit\"><code class=\"xref py py-func docutils literal notranslate\">commit()</code></a> or a <a class=\"reference internal\" href=\"#django.db.transaction.rollback\" title=\"django.db.transaction.rollback\"><code class=\"xref py py-func docutils literal notranslate\">rollback()</code></a>, sebelum menyalakan penjalanan otomatis.</p>\n<p>Django akan menolak mematikan autocommit ketika blok <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a>  aktif, karena itu akan merusak atomicity.</p>\n</section>\n<section id=\"transactions\">\n<h3>Transaksi<a class=\"heading-anchor\" href=\"#transactions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Sebuah transaksi adalah atomic kumpulan dari permintaan basisdata. Bahkan jika program anda tabrakan, basisdata menjamin bahwa baik semua perubahan akan diberlakukan, atau tidak dari mereka.</p>\n<p>Django tidak menyediakan sebuah API untuk memulai sebuah transaksi. Cara diharapkan memulai sebuah transaksi adalah meniadakan autocommit dengan <a class=\"reference internal\" href=\"#django.db.transaction.set_autocommit\" title=\"django.db.transaction.set_autocommit\"><code class=\"xref py py-func docutils literal notranslate\">set_autocommit()</code></a>.</p>\n<p>Sekali anda berada dalam transaksi, anda dapat memilih antara memberlakukan perubahan anda telah lakukan sampai titik ini dengan <a class=\"reference internal\" href=\"#django.db.transaction.commit\" title=\"django.db.transaction.commit\"><code class=\"xref py py-func docutils literal notranslate\">commit()</code></a>, atau mmebatalkan mereka dengan <a class=\"reference internal\" href=\"#django.db.transaction.rollback\" title=\"django.db.transaction.rollback\"><code class=\"xref py py-func docutils literal notranslate\">rollback()</code></a>. Fungsi-fungsi ini ditentukan dalam <a class=\"reference internal\" href=\"#module-django.db.transaction\" title=\"django.db.transaction\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.transaction</code></a>.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.commit\">\n<span class=\"sig-name descname\">commit</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.commit\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.rollback\">\n<span class=\"sig-name descname\">rollback</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.rollback\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Fungsi-fungsi ini mengambil sebuah argumen <code class=\"docutils literal notranslate\">using</code> yang harus berupa nama dari basisdata. Jika itu tidak disediakan, Django menggunakan basisdata <code class=\"docutils literal notranslate\">&quot;default&quot;</code>.</p>\n<p>Django menolak commit atau rollback ketika sebuah blok <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> aktif, karena itu akan merusak atomicity.</p>\n</section>\n<section id=\"topics-db-transactions-savepoints\">\n<span id=\"id4\"></span><h3>Savepoint<a class=\"heading-anchor\" href=\"#topics-db-transactions-savepoints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A savepoint is a marker within a transaction that enables you to roll back\npart of a transaction, rather than the full transaction. Savepoints are\navailable with the SQLite, PostgreSQL, Oracle, and MySQL (when using the InnoDB\nstorage engine) backends. Other backends provide the savepoint functions, but\nthey're empty operations -- they don't actually do anything.</p>\n<p>Savepoint bukanlah khususnya berguna jika anda sedang menggunakan autocommit, perilaku kebiasaan dari Django. Bagaimanapun, sekali anda membuka sebuah transaksi dengan <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a>, anda membangun deretan tindakan-tindakan basisdata menunggu sebuah commit atau rollback. Jika anda menerbitkan sebuah rollback, transaksi keseluruhan diputar kembali yang akan dilakukan dengan <code class=\"docutils literal notranslate\">transaction.rollback()</code>.</p>\n<p>Ketika penghias  <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> bersarang, itu membuat sebuah savepoint untuk mengizinkan commit atau rollback sebagian. Anda sangat dianjurkan menggunakan <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> daripada fungsi-fungsi digambarkan dibawah, tetapi mereka adalah masih bagian dari API umum, dan tidak ada rencana mengusangkan mereka.</p>\n<p>Each of these functions takes a <code class=\"docutils literal notranslate\">using</code> argument which should be the name of\na database for which the behavior applies. If no <code class=\"docutils literal notranslate\">using</code> argument is\nprovided then the <code class=\"docutils literal notranslate\">&quot;default&quot;</code> database is used.</p>\n<p>Savepoint dikendalikan oleh tiga fungsi dalam <a class=\"reference internal\" href=\"#module-django.db.transaction\" title=\"django.db.transaction\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.transaction</code></a>:</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.savepoint\">\n<span class=\"sig-name descname\">savepoint</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.savepoint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-deprecated\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 6.1</p><p><span class=\"versionmodified deprecated\">Ditinggalkan sejak versi 6.1: </span><code class=\"docutils literal notranslate\">savepoint</code> has been renamed to <code class=\"docutils literal notranslate\">savepoint_create</code>.</p>\n</aside>\n<p>Membuat sebuah savepoint baru. Ini menandai sebuah titik dalam transaksi yang dikenal sebagai keadaan &quot;good&quot;. Mengembalikan ID savepoint (<code class=\"docutils literal notranslate\">sid</code>).</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.savepoint_create\">\n<span class=\"sig-name descname\">savepoint_create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.savepoint_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>Membuat sebuah savepoint baru. Ini menandai sebuah titik dalam transaksi yang dikenal sebagai keadaan &quot;good&quot;. Mengembalikan ID savepoint (<code class=\"docutils literal notranslate\">sid</code>).</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.savepoint_commit\">\n<span class=\"sig-name descname\">savepoint_commit</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sid</em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.savepoint_commit\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Bebaskan savepoint <code class=\"docutils literal notranslate\">sid</code>. Perubahan dilakukan sejak savepoint dibuat menjadi bagian dari transaksi.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.savepoint_rollback\">\n<span class=\"sig-name descname\">savepoint_rollback</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sid</em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.savepoint_rollback\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Memutar kembali transaksi pada savepoint <code class=\"docutils literal notranslate\">sid</code>.</p>\n</dd></dl>\n\n<p>Fungsi-fungsi ini tidak melakukan apapun jika savepoint tidak didukung atau jika basisdata dalam suasana penjalanan otomatis.</p>\n<p>Sebagai tambahan, ada fungsi kegunaan:</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.clean_savepoints\">\n<span class=\"sig-name descname\">clean_savepoints</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.clean_savepoints\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Setel kembali penghitung digunakan untuk membangkitkan ID savepoint unik.</p>\n</dd></dl>\n\n<p>Contoh berikut mempertunjukkan penggunaan dari savepoint:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> transaction\n\n\n<span class=\"c1\"># open a transaction</span>\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span>atomic\n<span class=\"k\">def</span> <span class=\"nf\">viewfunc</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    a<span class=\"o\">.</span>save<span class=\"p\">()</span>\n    <span class=\"c1\"># transaction now contains a.save()</span>\n\n    sid <span class=\"o\">=</span> transaction<span class=\"o\">.</span>savepoint_create<span class=\"p\">()</span>\n\n    b<span class=\"o\">.</span>save<span class=\"p\">()</span>\n    <span class=\"c1\"># transaction now contains a.save() and b.save()</span>\n\n    <span class=\"k\">if</span> want_to_keep_b<span class=\"p\">:</span>\n        transaction<span class=\"o\">.</span>savepoint_commit<span class=\"p\">(</span>sid<span class=\"p\">)</span>\n        <span class=\"c1\"># open transaction still contains a.save() and b.save()</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        transaction<span class=\"o\">.</span>savepoint_rollback<span class=\"p\">(</span>sid<span class=\"p\">)</span>\n        <span class=\"c1\"># open transaction now contains only a.save()</span>\n</code></pre></div>\n<p>Savepoint dapat digunakan untuk memulihkan dari kesalahan basisdata dengan melakukan rollback sebagian. Jika anda sedang melakukan ini didalam sebuah blok <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a>, keseluruhan blok akan masih dapat di rollback, karena itu tidak mengetahui anda telah menangani keadaan pada tingkatan terendah! Untuk mencegah ini, anda dapat mengendalikan perilaku rollback dengan fungsi-fungsi berikut.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.get_rollback\">\n<span class=\"sig-name descname\">get_rollback</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.get_rollback\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.set_rollback\">\n<span class=\"sig-name descname\">set_rollback</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">rollback</em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.transaction.set_rollback\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Setel bendera rollback menjadi <code class=\"docutils literal notranslate\">True</code> memaksa sebuah rollback ketika keluar blok atomik paling sebelah dalam. Ini mungkin berguna untuk memicu sebuah rollback tanpa memunculkan sebuah pengecualian.</p>\n<p>Setel itu menjadi <code class=\"docutils literal notranslate\">False</code> mencegah rollback seperti itu. Sebelum melakukan itu, pastikan anda telah rollback transaksi pada savepoint dikenal-baik dalam blok atomic saat ini! Sebaliknya anda sedang merusak atomic dan kerusakan data mungkin muncul.</p>\n</section>\n</section>\n<section id=\"database-specific-notes\">\n<h2>Catatan khusus-basisdata<a class=\"heading-anchor\" href=\"#database-specific-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"savepoints-in-sqlite\">\n<span id=\"id5\"></span><h3>Savepoint di SQLite<a class=\"heading-anchor\" href=\"#savepoints-in-sqlite\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>While SQLite supports savepoints, a flaw in the design of the <a class=\"reference external\" href=\"https://docs.python.org/3/library/sqlite3.html#module-sqlite3\" title=\"(di Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">sqlite3</code></a>\nmodule makes them hardly usable.</p>\n<p>Ketika autocommit diadakan, savepoint tidak masuk akal. Ketika itu ditiadakan, <a class=\"reference external\" href=\"https://docs.python.org/3/library/sqlite3.html#module-sqlite3\" title=\"(di Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">sqlite3</code></a> commit secara mutlak sebelum pernyataan savepoint. (Dalam faktanya, itu commit sebelum pernyataan apapun selain dari <code class=\"docutils literal notranslate\">SELECT</code>, <code class=\"docutils literal notranslate\">INSERT</code>, <code class=\"docutils literal notranslate\">UPDATE</code>, <code class=\"docutils literal notranslate\">DELETE</code> dan <code class=\"docutils literal notranslate\">REPLACE</code>.) Kesalahan ini memiliki dua konsekuensi:</p>\n<ul class=\"simple\">\n<li><p>The low level APIs for savepoints are only usable inside a transaction i.e.\ninside an <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> block.</p></li>\n<li><p>Sangat tidak mungkin menggunakan <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> ketika penjalan otomatis dimatikan.</p></li>\n</ul>\n</section>\n<section id=\"transactions-in-mysql\">\n<h3>Transaksi di MySQL<a class=\"heading-anchor\" href=\"#transactions-in-mysql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda sedang menggunakan MySQL, tabel-tabel anda mungkin atau mungkin tidak mendukung transaksi; itu tergantung pada versi MySQL anda dan jenis-jenis tabel anda sedang gunakan. (Berdasarkan &quot;table types,&quot; kami artikan sesuatu seperti &quot;InnoDB&quot; or &quot;MyISAM&quot;.) Kekhasan transaksi MySQL adalah diluar cakupan dari artikel ini, tetapi situs MySQL mempunyai <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-transactional-statements.html\">information on MySQL transactions</a>.</p>\n<p>Jika pengaturan MySQL anda <em>tidak</em> mendukung transaksi, kemudian Django akan selalu menggunakan suasana penjalan otomatis: pernyataan-pernyataan akan dijalankan dan diperlakukan segera mereka dipanggil. Jika pengaturan MySQL anda <em>melakukan</em> mendukung transaksi, Django akan menangani transaksi-transaksi seperti dijelaskan dalam dokumen ini.</p>\n</section>\n<section id=\"handling-exceptions-within-postgresql-transactions\">\n<h3>Penanganan pengecualian dalam transaksi PostgreSQL<a class=\"heading-anchor\" href=\"#handling-exceptions-within-postgresql-transactions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Bagian ini hanya bersangkut paut hanya jika anda sedang menerapkan pengelolaan transaksi anda sendiri. Masalah ini tidak dapat muncul dalam keadaan awalan Django dan <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> menangani itu otomatis.</p>\n</aside>\n<p>Inside a transaction, when a call to a PostgreSQL cursor raises an exception\n(typically <code class=\"docutils literal notranslate\">IntegrityError</code>), all subsequent SQL in the same transaction\nwill fail with the error &quot;current transaction is aborted, queries ignored\nuntil end of transaction block&quot;. While the basic use of <code class=\"docutils literal notranslate\">save()</code> is unlikely\nto raise an exception in PostgreSQL, there are more advanced usage patterns\nwhich might, such as saving objects with unique fields, saving using the\n<code class=\"docutils literal notranslate\">force_insert</code>/<code class=\"docutils literal notranslate\">force_update</code> flag, or invoking custom SQL.</p>\n<p>Ada beberapa cara memulihkan dari urutan kesalahan ini.</p>\n<section id=\"transaction-rollback\">\n<h4>Gulung kembali transaksi<a class=\"heading-anchor\" href=\"#transaction-rollback\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pilihan pertama adalah memutar kembali transaksi keseluruhan. Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>a<span class=\"o\">.</span>save<span class=\"p\">()</span>  <span class=\"c1\"># Succeeds, but may be undone by transaction rollback</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    b<span class=\"o\">.</span>save<span class=\"p\">()</span>  <span class=\"c1\"># Could throw exception</span>\n<span class=\"k\">except</span> IntegrityError<span class=\"p\">:</span>\n    transaction<span class=\"o\">.</span>rollback<span class=\"p\">()</span>\nc<span class=\"o\">.</span>save<span class=\"p\">()</span>  <span class=\"c1\"># Succeeds, but a.save() may have been undone</span>\n</code></pre></div>\n<p>Memanggil memutar kembali <code class=\"docutils literal notranslate\">transaction.rollback()</code> keseluruhan transaksi. Apapun tindakan basisdata tidak di commit akan hilang. Dalam contoh ini, perubahan dibuat oleh <code class=\"docutils literal notranslate\">a.save()</code> akan hilang, meski pekerjaan itu tidak memunculkan kesalahan itu sendiri.</p>\n</section>\n<section id=\"savepoint-rollback\">\n<h4>Memutar kembali savepoint<a class=\"heading-anchor\" href=\"#savepoint-rollback\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Anda dapat menggunakan <span class=\"xref std std-ref\">savepoints 1</span> untuk mengendalikan tingkat dari memutar kembali. Sebelum melakukan tindakan basisdata yang dapat gagal, anda dapat menyetel atau memperbaharui savepoint; cara itu, jika tindakan gagal, anda dapat memutar kembali tindakan tunggal menyinggung, daripada transaksi keseluruhan. Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>a<span class=\"o\">.</span>save<span class=\"p\">()</span>  <span class=\"c1\"># Succeeds, and never undone by savepoint rollback</span>\nsid <span class=\"o\">=</span> transaction<span class=\"o\">.</span>savepoint_create<span class=\"p\">()</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    b<span class=\"o\">.</span>save<span class=\"p\">()</span>  <span class=\"c1\"># Could throw exception</span>\n    transaction<span class=\"o\">.</span>savepoint_commit<span class=\"p\">(</span>sid<span class=\"p\">)</span>\n<span class=\"k\">except</span> IntegrityError<span class=\"p\">:</span>\n    transaction<span class=\"o\">.</span>savepoint_rollback<span class=\"p\">(</span>sid<span class=\"p\">)</span>\nc<span class=\"o\">.</span>save<span class=\"p\">()</span>  <span class=\"c1\"># Succeeds, and a.save() is never undone</span>\n</code></pre></div>\n<p>Dalam contoh ini, <code class=\"docutils literal notranslate\">a.save()</code> tidak akan dilepas dalam kasus dimana <code class=\"docutils literal notranslate\">b.save()</code> memunculkan sebuah pengecualian.</p>\n</section>\n</section>\n</section>","rootId":"module-django.db.transaction","toc":[{"title":"Mengelola transaksi basisdata","anchor":"managing-database-transactions","children":[{"title":"Kebiasaan transaksi awal Django","anchor":"django-s-default-transaction-behavior","children":[]},{"title":"Mengikat transaksi pada permintaan HTTP","anchor":"tying-transactions-to-http-requests","children":[]},{"title":"Mengendalikan transaksi secara eksplisit","anchor":"controlling-transactions-explicitly","children":[]}]},{"title":"Penyerahan otomatis","anchor":"autocommit","children":[{"title":"Kenapa Django menggunakan penyerahan otomatis","anchor":"why-django-uses-autocommit","children":[]},{"title":"Menonaktifkan pengelolaan transaksi","anchor":"deactivating-transaction-management","children":[]}]},{"title":"Melakukan tindakan setelah penyerahan","anchor":"performing-actions-after-commit","children":[{"title":"Savepoint","anchor":"savepoints","children":[]},{"title":"Urutan pelaksanaan","anchor":"order-of-execution","children":[]},{"title":"Penanganan pengecualian","anchor":"exception-handling","children":[]},{"title":"Waktu pelaksanaan","anchor":"timing-of-execution","children":[]},{"title":"Digunakan dalam percobaan","anchor":"use-in-tests","children":[]},{"title":"Why no rollback hook?","anchor":"why-no-rollback-hook","children":[]}]},{"title":"API tingkat-rendah","anchor":"low-level-apis","children":[{"title":"Penyerahan otomatis","anchor":"managing-autocommit","children":[]},{"title":"Transaksi","anchor":"transactions","children":[]},{"title":"Savepoint","anchor":"topics-db-transactions-savepoints","children":[]}]},{"title":"Catatan khusus-basisdata","anchor":"database-specific-notes","children":[{"title":"Savepoint di SQLite","anchor":"savepoints-in-sqlite","children":[]},{"title":"Transaksi di MySQL","anchor":"transactions-in-mysql","children":[]},{"title":"Penanganan pengecualian dalam transaksi PostgreSQL","anchor":"handling-exceptions-within-postgresql-transactions","children":[{"title":"Gulung kembali transaksi","anchor":"transaction-rollback","children":[]},{"title":"Memutar kembali savepoint","anchor":"savepoint-rollback","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/6.1/topics/"},{"docname":"topics/db/index","title":"Model dan basisdata","url":"/id/6.1/topics/db/"}],"prev":{"docname":"topics/db/sql","title":"Melakukan permintaan SQL mentah","url":"/id/6.1/topics/db/sql/"},"next":{"docname":"topics/db/multi-db","title":"Basisdata banyak","url":"/id/6.1/topics/db/multi-db/"},"formats":{"html":"/id/6.1/topics/db/transactions/","markdown":"/id/6.1/topics/db/transactions.md","json":"/id/6.1/topics/db/transactions.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/db/transactions.txt","official":"https://docs.djangoproject.com/id/6.1/topics/db/transactions/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}