{"title":"Databastransaktioner","version":"6.0","locale":"sv","docname":"topics/db/transactions","url":"/sv/6.0/topics/db/transactions/","canonical":"https://djangodocs.dev/sv/6.0/topics/db/transactions/","summary":"Django ger dig några sätt att kontrollera hur databastransaktioner hanteras. Hantering av databastransaktioner Link to this heading # Djangos standardbeteende för…","html":"<span id=\"database-transactions\"></span><h1>Databastransaktioner<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 ger dig några sätt att kontrollera hur databastransaktioner hanteras.</p>\n<section id=\"managing-database-transactions\">\n<h2>Hantering av databastransaktioner<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>Djangos standardbeteende för transaktioner<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>Djangos standardbeteende är att köra i autocommit-läge. Varje fråga bekräftas omedelbart till databasen, såvida inte en transaktion är aktiv. <a class=\"reference internal\" href=\"#autocommit-details\"><span class=\"std std-ref\">Se nedan för detaljer</span></a>.</p>\n<p>Django använder transaktioner eller sparpunkter automatiskt för att garantera integriteten i ORM-operationer som kräver flera frågor, särskilt <a class=\"reference internal\" href=\"/sv/6.0/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">delete()</span></a> och <a class=\"reference internal\" href=\"/sv/6.0/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">update()</span></a> frågor.</p>\n<p>Djangos klass <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a> kapslar också in varje test i en transaktion av prestandaskäl.</p>\n</section>\n<section id=\"tying-transactions-to-http-requests\">\n<span id=\"id1\"></span><h3>Koppling av transaktioner till HTTP-förfrågningar<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>Ett vanligt sätt att hantera transaktioner på webben är att varje förfrågan paketeras i en transaktion. Ange <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ATOMIC_REQUESTS</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> i konfigurationen för varje databas för vilken du vill aktivera detta beteende.</p>\n<p>Det fungerar på följande sätt. Innan en view-funktion anropas startar Django en transaktion. Om svaret produceras utan problem, förbinder Django transaktionen. Om vyn producerar ett undantag rullar Django tillbaka transaktionen.</p>\n<p>Du kan utföra undertransaktioner med hjälp av sparpunkter i din vykod, vanligtvis med kontexthanteraren <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>. I slutet av vyn kommer dock antingen alla eller inga av ändringarna att bekräftas.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Även om enkelheten i den här transaktionsmodellen är tilltalande, gör den den också ineffektiv när trafiken ökar. Att öppna en transaktion för varje vy innebär en viss overhead. Effekten på prestandan beror på frågemönstren i din applikation och på hur väl din databas hanterar låsning.</p>\n</aside>\n<aside class=\"admonition-per-request-transactions-and-streaming-responses admonition\">\n<p class=\"admonition-title\">Transaktioner per förfrågan och strömmande svar</p>\n<p>När en vy returnerar en <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a>, kommer läsning av innehållet i svaret ofta att exekvera kod för att generera innehållet. Eftersom vyn redan har returnerats körs sådan kod utanför transaktionen.</p>\n<p>Generellt sett är det inte tillrådligt att skriva till databasen medan ett streamingsvar genereras, eftersom det inte finns något vettigt sätt att hantera fel efter att svaret har börjat skickas.</p>\n</aside>\n<p>I praktiken innebär denna funktion att varje vyfunktion omsluts av dekoratorn <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> som beskrivs nedan.</p>\n<p>Observera att endast exekveringen av din vy är innesluten i transaktionerna. Middleware körs utanför transaktionen, och det gör även rendering av mallsvar.</p>\n<p>När <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ATOMIC_REQUESTS</span></code></a> är aktiverat är det fortfarande möjligt att förhindra att vyer körs i en transaktion.</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\"><span class=\"pre\">non_atomic_requests</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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>Denna dekorator upphäver effekten av <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ATOMIC_REQUESTS</span></code></a> för en given vy:</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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">transaction</span>\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span><span class=\"n\">non_atomic_requests</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">do_stuff</span><span class=\"p\">()</span>\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span><span class=\"n\">non_atomic_requests</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"o\">=</span><span class=\"s2\">&quot;other&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_other_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">do_stuff_on_the_other_database</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Det fungerar bara om det tillämpas på själva vyn.</p>\n</dd></dl>\n\n</section>\n<section id=\"controlling-transactions-explicitly\">\n<h3>Explicit kontroll av transaktioner<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 tillhandahåller ett enda API för att styra databastransaktioner.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.transaction.atomic\">\n<span class=\"sig-name descname\"><span class=\"pre\">atomic</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">savepoint</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">durable</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></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 är den definierande egenskapen för databastransaktioner. med <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code> kan vi skapa ett kodblock inom vilket atomiciteten i databasen garanteras. Om kodblocket slutförs framgångsrikt överförs ändringarna till databasen. Om det finns ett undantag rullas ändringarna tillbaka.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">atomiska</span></code> block kan vara nästlade. I detta fall, när ett inre block slutförs framgångsrikt, kan dess effekter fortfarande rullas tillbaka om ett undantag uppstår i det yttre blocket vid en senare tidpunkt.</p>\n<p>Ibland är det bra att se till att ett <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiskt</span></code> block alltid är det yttersta <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiska</span></code> blocket, så att alla databasändringar bekräftas när blocket avslutas utan fel. Detta kallas för durability och kan uppnås genom att ställa in <code class=\"docutils literal notranslate\"><span class=\"pre\">durable=True</span></code>. Om det <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiska</span></code> blocket är kapslat i ett annat block ger det upphov till ett <code class=\"docutils literal notranslate\"><span class=\"pre\">RuntimeError</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code> is usable both as a <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-decorator\" title=\"(in 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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">transaction</span>\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">viewfunc</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># This code executes inside a transaction.</span>\n    <span class=\"n\">do_stuff</span><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=\"(in 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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">transaction</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">viewfunc</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># This code executes in autocommit mode (Django&#39;s default).</span>\n    <span class=\"n\">do_stuff</span><span class=\"p\">()</span>\n\n    <span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>\n        <span class=\"c1\"># This code executes inside a transaction.</span>\n        <span class=\"n\">do_more_stuff</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Genom att paketera <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code> i ett try/except-block möjliggörs en naturlig hantering av integritetsfel:</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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">IntegrityError</span><span class=\"p\">,</span> <span class=\"n\">transaction</span>\n\n\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">viewfunc</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">create_parent</span><span class=\"p\">()</span>\n\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>\n            <span class=\"n\">generate_relationships</span><span class=\"p\">()</span>\n    <span class=\"k\">except</span> <span class=\"n\">IntegrityError</span><span class=\"p\">:</span>\n        <span class=\"n\">handle_exception</span><span class=\"p\">()</span>\n\n    <span class=\"n\">add_children</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>I det här exemplet kan du, även om <code class=\"docutils literal notranslate\"><span class=\"pre\">generate_relationships()</span></code> orsakar ett databasfel genom att bryta en integritetsbegränsning, köra frågor i <code class=\"docutils literal notranslate\"><span class=\"pre\">add_children()</span></code>, och ändringarna från <code class=\"docutils literal notranslate\"><span class=\"pre\">create_parent()</span></code> finns fortfarande kvar och är bundna till samma transaktion. Observera att alla operationer som försökts i <code class=\"docutils literal notranslate\"><span class=\"pre\">generate_relationships()</span></code> redan kommer att ha rullats tillbaka på ett säkert sätt när <code class=\"docutils literal notranslate\"><span class=\"pre\">handle_exception()</span></code> anropas, så undantagshanteraren kan också operera på databasen om det behövs.</p>\n<aside class=\"admonition-avoid-catching-exceptions-inside-atomic admonition\">\n<p class=\"admonition-title\">Undvik att fånga undantag inuti <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code>!</p>\n<p>När ett <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiskt</span></code> block avslutas tittar Django på om det avslutades normalt eller med ett undantag för att avgöra om det ska bekräftas eller rullas tillbaka. Om du fångar och hanterar undantag inuti ett <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiskt</span></code> block kan du dölja för Django att ett problem har uppstått. Detta kan resultera i oväntat beteende.</p>\n<p>Detta är främst ett problem för <a class=\"reference internal\" href=\"/sv/6.0/ref/exceptions/#django.db.DatabaseError\" title=\"django.db.DatabaseError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DatabaseError</span></code></a> och dess underklasser som <a class=\"reference internal\" href=\"/sv/6.0/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a>. Efter ett sådant fel bryts transaktionen och Django kommer att utföra en rollback i slutet av det <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiska</span></code> blocket. Om du försöker köra databasfrågor innan rollback sker, kommer Django att höja en <a class=\"reference internal\" href=\"/sv/6.0/ref/exceptions/#django.db.transaction.TransactionManagementError\" title=\"django.db.transaction.TransactionManagementError\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TransactionManagementError</span></code></a>. Du kan också stöta på detta beteende när en ORM-relaterad signalhanterare ger upphov till ett undantag.</p>\n<p>Det korrekta sättet att fånga upp databasfel är runt ett <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiskt</span></code> block som visas ovan. Om det behövs, lägg till ett extra <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code> block för detta ändamål. Det här mönstret har en annan fördel: det avgränsar uttryckligen vilka operationer som ska rullas tillbaka om ett undantag inträffar.</p>\n<p>Om du fångar upp undantag som orsakas av råa SQL-frågor är Djangos beteende ospecificerat och databasberoende.</p>\n</aside>\n<aside class=\"admonition-you-may-need-to-manually-revert-app-state-when-rolling-back-a-transaction admonition\">\n<p class=\"admonition-title\">Du kan behöva återställa appstatus manuellt när du rullar tillbaka en transaktion.</p>\n<p>Värdena för en modells fält återställs inte när en transaktion rullas tillbaka. Detta kan leda till ett inkonsekvent modelltillstånd om du inte manuellt återställer de ursprungliga fältvärdena.</p>\n<p>Till exempel, om <code class=\"docutils literal notranslate\"><span class=\"pre\">MyModel</span></code> har ett <code class=\"docutils literal notranslate\"><span class=\"pre\">active</span></code>-fält, säkerställer detta utdrag att <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">obj.active</span></code>-kontrollen i slutet använder rätt värde om uppdateringen av <code class=\"docutils literal notranslate\"><span class=\"pre\">active</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> misslyckas i transaktionen:</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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">DatabaseError</span><span class=\"p\">,</span> <span class=\"n\">transaction</span>\n\n<span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"n\">active</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">active</span> <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> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>\n        <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"k\">except</span> <span class=\"n\">DatabaseError</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">active</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n<span class=\"k\">if</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">active</span><span class=\"p\">:</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Detta gäller även alla andra mekanismer som kan hålla appens tillstånd, t.ex. cache eller globala variabler. Om koden t.ex. proaktivt uppdaterar data i cacheminnet efter att ett objekt har sparats, rekommenderas att du använder <a class=\"reference internal\" href=\"#performing-actions-after-commit\"><span class=\"std std-ref\">transaction.on_commit()</span></a> istället, för att skjuta upp cacheändringar tills transaktionen faktiskt genomförs.</p>\n</aside>\n<p>För att garantera atomicitet inaktiverar <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code> vissa API:er. Om du försöker göra en commit, roll back eller ändra autocommit-läget för databasanslutningen inom ett <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code>-block kommer ett undantag att uppstå.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code> tar ett <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> argument som bör vara namnet på en databas. Om detta argument inte tillhandahålls använder Django databasen <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;default&quot;</span></code>.</p>\n<p>Under huven, Djangos kod för transaktionshantering:</p>\n<ul class=\"simple\">\n<li><p>öppnar en transaktion när den går in i det yttersta <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiska</span></code> blocket;</p></li>\n<li><p>skapar en sparpunkt när du går in i ett inre <code class=\"docutils literal notranslate\"><span class=\"pre\">atomiskt</span></code> block;</p></li>\n<li><p>frigör eller rullar tillbaka till sparpunkten när ett inre block avslutas;</p></li>\n<li><p>genomför eller rullar tillbaka transaktionen när det yttersta blocket avslutas.</p></li>\n</ul>\n<p>Du kan inaktivera skapandet av sparpunkter för inre block genom att ställa in argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">savepoint</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Om ett undantag inträffar kommer Django att utföra en rollback genom att avsluta det första överordnade blocket med en savepoint om det finns en, och det yttersta blocket annars. Atomicitet garanteras fortfarande av den yttre transaktionen. Detta alternativ bör endast användas om omkostnaderna för sparpunkter är märkbara. Det har nackdelen att det bryter mot felhanteringen som beskrivs ovan.</p>\n<p>Du kan använda <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic</span></code> när autocommit är avstängt. Det kommer bara att använda sparpunkter, även för det yttersta blocket.</p>\n</dd></dl>\n\n<aside class=\"admonition-performance-considerations admonition\">\n<p class=\"admonition-title\">Överväganden om prestanda</p>\n<p>Öppna transaktioner innebär en prestandakostnad för din databasserver. För att minimera denna overhead bör du hålla dina transaktioner så korta som möjligt. Detta är särskilt viktigt om du använder <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> i långvariga processer, utanför Djangos request / response-cykel.</p>\n</aside>\n</section>\n</section>\n<section id=\"autocommit\">\n<h2>Autocommit<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>Varför Django använder autocommit<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>I SQL-standarderna startar varje SQL-fråga en transaktion, såvida inte en transaktion redan är aktiv. Sådana transaktioner måste då uttryckligen bekräftas eller rullas tillbaka.</p>\n<p>Detta är inte alltid bekvämt för applikationsutvecklare. För att lindra detta problem tillhandahåller de flesta databaser ett autocommit-läge. När autocommit är aktiverat och ingen transaktion är aktiv, blir varje SQL-fråga inkapslad i en egen transaktion. Med andra ord startar inte bara varje sådan fråga en transaktion, utan transaktionen blir också automatiskt bekräftad eller rullad tillbaka, beroende på om frågan lyckades.</p>\n<p><span class=\"target\" id=\"index-6\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a>, Python Database API Specification v2.0, kräver att autocommit initialt ska vara avstängt. Django åsidosätter denna standard och slår på autocommit.</p>\n<p>För att undvika detta kan du <a class=\"reference internal\" href=\"#deactivate-transaction-management\"><span class=\"std std-ref\">avaktivera transaktionshanteringen</span></a>, men det rekommenderas inte.</p>\n</section>\n<section id=\"deactivating-transaction-management\">\n<span id=\"deactivate-transaction-management\"></span><h3>Avaktivera transaktionshantering<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>Du kan helt inaktivera Djangos transaktionshantering för en viss databas genom att ställa in <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-DATABASE-AUTOCOMMIT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTOCOMMIT</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> i dess konfiguration. Om du gör detta kommer Django inte att aktivera autocommit och kommer inte att utföra några commits. Du kommer att få det vanliga beteendet hos det underliggande databasbiblioteket.</p>\n<p>Detta kräver att du uttryckligen bekräftar varje transaktion, även de som startas av Django eller av tredjepartsbibliotek. Därför används detta bäst i situationer där du vill köra din egen transaktionskontrollerande middleware eller göra något riktigt konstigt.</p>\n</section>\n</section>\n<section id=\"performing-actions-after-commit\">\n<span id=\"id2\"></span><h2>Utföra åtgärder efter commit<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>Ibland behöver du utföra en åtgärd som är relaterad till den aktuella databastransaktionen, men bara om transaktionen har överförts. Exempel på detta kan vara en bakgrundsuppgift, ett e-postmeddelande eller en inaktivering av cacheminnet.</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\"><span class=\"pre\">on_commit()</span></code></a> gör det möjligt att registrera callbacks som kommer att utföras efter att den öppna transaktionen har bekräftats:</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\"><span class=\"pre\">on_commit</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">func</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">robust</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></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>Skicka en funktion, eller en valfri anropsbar funktion, till <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\"><span class=\"pre\">on_commit()</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">transaction</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">send_welcome_email</span><span class=\"p\">():</span> <span class=\"o\">...</span>\n\n\n<span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">on_commit</span><span class=\"p\">(</span><span class=\"n\">send_welcome_email</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Callbacks får inte några argument, men du kan binda dem med <a class=\"reference external\" href=\"https://docs.python.org/3/library/functools.html#functools.partial\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">functools.partial()</span></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=\"w\"> </span><span class=\"nn\">functools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">partial</span>\n\n<span class=\"k\">for</span> <span class=\"n\">user</span> <span class=\"ow\">in</span> <span class=\"n\">users</span><span class=\"p\">:</span>\n    <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">on_commit</span><span class=\"p\">(</span><span class=\"n\">partial</span><span class=\"p\">(</span><span class=\"n\">send_invite_email</span><span class=\"p\">,</span> <span class=\"n\">user</span><span class=\"o\">=</span><span class=\"n\">user</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Callbacks anropas efter att den öppna transaktionen har bekräftats. Om transaktionen i stället rullas tillbaka (vanligtvis när ett ohanterat undantag uppstår i ett <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>-block), kommer återkallelsen att kasseras och aldrig anropas.</p>\n<p>Om du anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">on_commit()</span></code> medan det inte finns någon öppen transaktion, kommer återuppringningen att utföras omedelbart.</p>\n<p>Det är ibland användbart att registrera callbacks som kan misslyckas. Genom att ange <code class=\"docutils literal notranslate\"><span class=\"pre\">robust=True</span></code> kan nästa callback utföras även om den aktuella callbacken ger upphov till ett undantag. Alla fel som härrör från Pythons klass <code class=\"docutils literal notranslate\"><span class=\"pre\">Exception</span></code> fångas upp och loggas till loggern <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends.base</span></code>.</p>\n<p>Du kan använda <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TestCase.captureOnCommitCallbacks\" title=\"django.test.TestCase.captureOnCommitCallbacks\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">TestCase.captureOnCommitCallbacks()</span></code></a> för att testa callbacks som registrerats med <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\"><span class=\"pre\">on_commit()</span></code></a>.</p>\n<section id=\"savepoints\">\n<h3>Spara poäng<a class=\"heading-anchor\" href=\"#savepoints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Sparpunkter (d.v.s. nästlade <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>-block) hanteras korrekt. Det vill säga, en <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\"><span class=\"pre\">on_commit()</span></code></a> callable som registreras efter en savepoint (i ett nästlat <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> block) kommer att anropas efter att den yttre transaktionen har committats, men inte om en rollback till den savepointen eller någon tidigare savepoint inträffade under transaktionen:</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> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>  <span class=\"c1\"># Outer atomic, start a new transaction</span>\n    <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">on_commit</span><span class=\"p\">(</span><span class=\"n\">foo</span><span class=\"p\">)</span>\n\n    <span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>  <span class=\"c1\"># Inner atomic block, create a savepoint</span>\n        <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">on_commit</span><span class=\"p\">(</span><span class=\"n\">bar</span><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>Å andra sidan, när en sparpunkt rullas tillbaka (på grund av att ett undantag har uppstått), kommer den inre anropsbarheten inte att anropas:</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> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>  <span class=\"c1\"># Outer atomic, start a new transaction</span>\n    <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">on_commit</span><span class=\"p\">(</span><span class=\"n\">foo</span><span class=\"p\">)</span>\n\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>  <span class=\"c1\"># Inner atomic block, create a savepoint</span>\n            <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">on_commit</span><span class=\"p\">(</span><span class=\"n\">bar</span><span class=\"p\">)</span>\n            <span class=\"k\">raise</span> <span class=\"n\">SomeError</span><span class=\"p\">()</span>  <span class=\"c1\"># Raising an exception - abort the savepoint</span>\n    <span class=\"k\">except</span> <span class=\"n\">SomeError</span><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>Verkställighetsordning<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-funktioner för en viss transaktion utförs i den ordning de registrerades.</p>\n</section>\n<section id=\"exception-handling\">\n<h3>Hantering av undantag<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>Om en on-commit-funktion som registrerats med <code class=\"docutils literal notranslate\"><span class=\"pre\">robust=False</span></code> inom en viss transaktion ger upphov till ett undantag som inte fångats upp, kommer inga senare registrerade funktioner i samma transaktion att köras. Detta är samma beteende som om du själv hade kört funktionerna sekventiellt utan <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\"><span class=\"pre\">on_commit()</span></code></a>.</p>\n</section>\n<section id=\"timing-of-execution\">\n<h3>Tidpunkt för verkställande<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>Dina callbacks exekveras <em>efter</em> en lyckad commit, så ett fel i en callback kommer inte att leda till att transaktionen rullas tillbaka. De exekveras villkorligt när transaktionen lyckas, men de är inte <em>del</em> av transaktionen. För de avsedda användningsfallen (e-postmeddelanden, bakgrundsuppgifter etc.) bör detta vara bra. Om det inte är det (om din uppföljningsåtgärd är så kritisk att dess misslyckande bör innebära att själva transaktionen misslyckas), då vill du inte använda <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\"><span class=\"pre\">on_commit()</span></code></a>-hook. Istället kanske du vill ha <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Two-phase_commit_protocol\">two-phase commit</a> som <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/basic/transactions.html#two-phase-commit\" title=\"(in psycopg)\"><span class=\"xref std std-ref\">psycopg Two-Phase Commit protocol support</span></a> och <span class=\"target\" id=\"index-7\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/#optional-two-phase-commit-extensions\"><strong>optional Two-Phase Commit Extensions in the Python DB-API specification</strong></a>.</p>\n<p>Callbacks körs inte förrän autocommit återställs på anslutningen efter commit (eftersom alla frågor som görs i en callback annars skulle öppna en implicit transaktion och förhindra att anslutningen går tillbaka till autocommit-läge).</p>\n<p>När funktionen är i autocommit-läge och utanför ett <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>-block kommer den att köras omedelbart, inte vid commit.</p>\n<p>On-commit-funktioner fungerar endast med <a class=\"reference internal\" href=\"#managing-autocommit\"><span class=\"std std-ref\">autocommit mode</span></a> och <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> (eller <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ATOMIC_REQUESTS</span></code></a>) transaktions-API. Om du anropar <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\"><span class=\"pre\">on_commit()</span></code></a> när autocommit är inaktiverat och du inte befinner dig inom ett atomic block kommer det att resultera i ett fel.</p>\n</section>\n<section id=\"use-in-tests\">\n<h3>Användning i tester<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>Djangos <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a>-klass omsluter varje test i en transaktion och rullar tillbaka transaktionen efter varje test för att tillhandahålla testisolering. Detta innebär att ingen transaktion någonsin faktiskt genomförs, vilket innebär att dina <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\"><span class=\"pre\">on_commit()</span></code></a> callbacks aldrig kommer att köras.</p>\n<p>Du kan övervinna denna begränsning genom att använda <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TestCase.captureOnCommitCallbacks\" title=\"django.test.TestCase.captureOnCommitCallbacks\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">TestCase.captureOnCommitCallbacks()</span></code></a>. Detta fångar dina <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\"><span class=\"pre\">on_commit()</span></code></a> callbacks i en lista, så att du kan göra påståenden om dem, eller emulera transaktionen genom att anropa dem.</p>\n<p>Ett annat sätt att övervinna begränsningen är att använda <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code></a> istället för <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a>. Detta kommer att innebära att dina transaktioner är bekräftade och att callbacks kommer att köras. Men <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code></a> rensar databasen mellan testerna, vilket är betydligt långsammare än <a class=\"reference internal\" href=\"/sv/6.0/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a>:s isolering.</p>\n</section>\n<section id=\"why-no-rollback-hook\">\n<h3>Varför ingen 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>En rollback-hook är svårare att implementera på ett robust sätt än en commit-hook, eftersom en mängd olika saker kan orsaka en implicit rollback.</p>\n<p>Om t.ex. din databasanslutning bryts på grund av att din process dödades utan möjlighet att stängas av på ett elegant sätt, kommer din rollback-hook aldrig att köras.</p>\n<p>Men det finns en lösning: istället för att göra något under det atomiska blocket (transaktionen) och sedan ångra det om transaktionen misslyckas, använd <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\"><span class=\"pre\">on_commit()</span></code></a> för att skjuta upp det till efter att transaktionen har lyckats. Det är mycket lättare att ångra något som man aldrig gjorde från början!</p>\n</section>\n</section>\n<section id=\"low-level-apis\">\n<h2>API:er på låg nivå<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\">Varning</p>\n<p>Föredra alltid <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> om det alls är möjligt. Det tar hänsyn till varje databas egenheter och förhindrar ogiltiga operationer.</p>\n<p>API:erna på låg nivå är bara användbara om du implementerar din egen transaktionshantering.</p>\n</aside>\n<section id=\"managing-autocommit\">\n<span id=\"id3\"></span><h3>Autocommit<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 tillhandahåller ett API i modulen <a class=\"reference internal\" href=\"#module-django.db.transaction\" title=\"django.db.transaction\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.db.transaction</span></code></a> för att hantera autocommit-läget för varje databasanslutning.</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\"><span class=\"pre\">get_autocommit</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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\"><span class=\"pre\">set_autocommit</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">autocommit</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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>Dessa funktioner tar ett <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> argument som bör vara namnet på en databas. Om det inte tillhandahålls använder Django databasen <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;default&quot;</span></code>.</p>\n<p>Autocommit är initialt aktiverat. Om du stänger av den är det ditt ansvar att återställa den.</p>\n<p>När du stänger av autocommit får du standardbeteendet för din databasadapter, och Django hjälper dig inte. Även om det beteendet specificeras i <span class=\"target\" id=\"index-8\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a>, är implementeringar av adaptrar inte alltid konsekventa med varandra. Granska dokumentationen för den adapter du använder noggrant.</p>\n<p>Du måste se till att ingen transaktion är aktiv, vanligtvis genom att utfärda en <a class=\"reference internal\" href=\"#django.db.transaction.commit\" title=\"django.db.transaction.commit\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">commit()</span></code></a> eller en <a class=\"reference internal\" href=\"#django.db.transaction.rollback\" title=\"django.db.transaction.rollback\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">rollback()</span></code></a>, innan du slår på autocommit igen.</p>\n<p>Django kommer att vägra att stänga av autocommit när ett <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>-block är aktivt, eftersom det skulle bryta atomiciteten.</p>\n</section>\n<section id=\"transactions\">\n<h3>Transaktioner<a class=\"heading-anchor\" href=\"#transactions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>En transaktion är en atomuppsättning av databasfrågor. Även om ditt program kraschar garanterar databasen att antingen alla ändringar kommer att tillämpas eller ingen av dem.</p>\n<p>Django tillhandahåller inte ett API för att starta en transaktion. Det förväntade sättet att starta en transaktion är att inaktivera autocommit med <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\"><span class=\"pre\">set_autocommit()</span></code></a>.</p>\n<p>När du är i en transaktion kan du välja att antingen tillämpa de ändringar du har utfört fram till denna punkt med <a class=\"reference internal\" href=\"#django.db.transaction.commit\" title=\"django.db.transaction.commit\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">commit()</span></code></a>, eller att avbryta dem med <a class=\"reference internal\" href=\"#django.db.transaction.rollback\" title=\"django.db.transaction.rollback\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">rollback()</span></code></a>. Dessa funktioner är definierade i <a class=\"reference internal\" href=\"#module-django.db.transaction\" title=\"django.db.transaction\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.db.transaction</span></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\"><span class=\"pre\">commit</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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\"><span class=\"pre\">rollback</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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>Dessa funktioner tar ett <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> argument som bör vara namnet på en databas. Om det inte tillhandahålls använder Django databasen <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;default&quot;</span></code>.</p>\n<p>Django kommer att vägra att göra en commit eller rollback när ett <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> block är aktivt, eftersom det skulle bryta atomiciteten.</p>\n</section>\n<section id=\"topics-db-transactions-savepoints\">\n<span id=\"id4\"></span><h3>Spara poäng<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>En savepoint är en markör inom en transaktion som gör att du kan rulla tillbaka en del av en transaktion, snarare än hela transaktionen. Savepoints är tillgängliga med backends SQLite, PostgreSQL, Oracle och MySQL (när du använder InnoDB-lagringsmotorn). Andra backends tillhandahåller savepoint-funktionerna, men de är tomma operationer - de gör faktiskt ingenting.</p>\n<p>Savepoints är inte särskilt användbara om du använder autocommit, standardbeteendet i Django. Men när du öppnar en transaktion med <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> bygger du upp en serie databasoperationer i väntan på en commit eller rollback. Om du utfärdar en rollback, rullas hela transaktionen tillbaka. Savepoints ger möjlighet att utföra en finkornig rollback, snarare än den fullständiga rollback som skulle utföras av <code class=\"docutils literal notranslate\"><span class=\"pre\">transaction.rollback()</span></code>.</p>\n<p>När dekoratorn <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> är nästlad skapar den en sparpunkt för att möjliggöra partiell commit eller rollback. Du uppmuntras starkt att använda <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> i stället för de funktioner som beskrivs nedan, men de är fortfarande en del av det offentliga API:et och det finns ingen plan för att avskaffa dem.</p>\n<p>Each of these functions takes a <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> argument which should be the name of\na database for which the behavior applies. If no <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> argument is\nprovided then the <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;default&quot;</span></code> database is used.</p>\n<p>Sparpunkter styrs av tre funktioner i <a class=\"reference internal\" href=\"#module-django.db.transaction\" title=\"django.db.transaction\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.db.transaction</span></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\"><span class=\"pre\">savepoint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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><p>Skapar en ny sparpunkt. Detta markerar en punkt i transaktionen som är känd för att vara i ett ”bra” tillstånd. Returnerar sparpunktens ID (<code class=\"docutils literal notranslate\"><span class=\"pre\">sid</span></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\"><span class=\"pre\">savepoint_commit</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sid</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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>Frigör lagringspunkten <code class=\"docutils literal notranslate\"><span class=\"pre\">sid</span></code>. De ändringar som gjorts sedan sparpunkten skapades blir en del av transaktionen.</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\"><span class=\"pre\">savepoint_rollback</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sid</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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>Rullar tillbaka transaktionen till sparpunkten <code class=\"docutils literal notranslate\"><span class=\"pre\">sid</span></code>.</p>\n</dd></dl>\n\n<p>Dessa funktioner gör ingenting om sparpunkter inte stöds eller om databasen är i autocommit-läge.</p>\n<p>Dessutom finns det en nyttofunktion:</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\"><span class=\"pre\">clean_savepoints</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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>Återställer räknaren som används för att generera unika ID:n för sparpunkter.</p>\n</dd></dl>\n\n<p>Följande exempel visar hur du kan använda savepoints:</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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">transaction</span>\n\n\n<span class=\"c1\"># open a transaction</span>\n<span class=\"nd\">@transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">viewfunc</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n    <span class=\"c1\"># transaction now contains a.save()</span>\n\n    <span class=\"n\">sid</span> <span class=\"o\">=</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">savepoint</span><span class=\"p\">()</span>\n\n    <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n    <span class=\"c1\"># transaction now contains a.save() and b.save()</span>\n\n    <span class=\"k\">if</span> <span class=\"n\">want_to_keep_b</span><span class=\"p\">:</span>\n        <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">savepoint_commit</span><span class=\"p\">(</span><span class=\"n\">sid</span><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        <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">savepoint_rollback</span><span class=\"p\">(</span><span class=\"n\">sid</span><span class=\"p\">)</span>\n        <span class=\"c1\"># open transaction now contains only a.save()</span>\n</code></pre></div>\n<p>Savepoints kan användas för att återhämta sig från ett databasfel genom att utföra en partiell rollback. Om du gör detta inuti ett <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>-block kommer hela blocket ändå att rullas tillbaka, eftersom det inte vet att du har hanterat situationen på en lägre nivå! För att förhindra detta kan du styra rollback-beteendet med följande funktioner.</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\"><span class=\"pre\">get_rollback</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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\"><span class=\"pre\">set_rollback</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">rollback</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></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>Om du ställer in rollback-flaggan till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> tvingas en rollback när du lämnar det innersta atomiska blocket. Detta kan vara användbart för att utlösa en rollback utan att skapa ett undantag.</p>\n<p>Om du ställer in den på <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> förhindras en sådan rollback. Innan du gör det, se till att du har rullat tillbaka transaktionen till en känd bra sparpunkt inom det aktuella atomiska blocket! Annars bryter du atomiciteten och datakorruption kan uppstå.</p>\n</section>\n</section>\n<section id=\"database-specific-notes\">\n<h2>Databasspecifika anteckningar<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>Sparpunkter i 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>SQLite stöder visserligen sparpunkter, men ett fel i <a class=\"reference external\" href=\"https://docs.python.org/3/library/sqlite3.html#module-sqlite3\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">sqlite3</span></code></a>-modulens design gör att de knappast är användbara.</p>\n<p>När autocommit är aktiverat är savepoints inte meningsfulla. När den är inaktiverad, gör <a class=\"reference external\" href=\"https://docs.python.org/3/library/sqlite3.html#module-sqlite3\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">sqlite3</span></code></a> implicit commits före savepoint-satser. (Faktum är att den committar före alla andra satser än <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">REPLACE</span></code>) Denna bugg har två konsekvenser:</p>\n<ul class=\"simple\">\n<li><p>API:erna på låg nivå för sparpunkter kan endast användas inom en transaktion, dvs. inom ett <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>-block.</p></li>\n<li><p>Det är omöjligt att använda <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> när autocommit är avstängt.</p></li>\n</ul>\n</section>\n<section id=\"transactions-in-mysql\">\n<h3>Transaktioner i 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>Om du använder MySQL kan det hända att dina tabeller stöder transaktioner eller inte; det beror på din MySQL-version och de tabelltyper du använder. (Med ”tabelltyper” menar vi något som ”InnoDB” eller ”MyISAM”.) MySQL-transaktionens särdrag ligger utanför ramen för denna artikel, men MySQL-webbplatsen har <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-transactional-statements.html\">information om MySQL-transaktioner</a>.</p>\n<p>Om din MySQL-konfiguration <em>inte</em> stöder transaktioner kommer Django alltid att fungera i autocommit-läge: uttalanden kommer att utföras och bekräftas så snart de anropas. Om din MySQL-installation <em>har</em> stöd för transaktioner, kommer Django att hantera transaktioner enligt vad som förklaras i detta dokument.</p>\n</section>\n<section id=\"handling-exceptions-within-postgresql-transactions\">\n<h3>Hantering av undantag inom PostgreSQL-transaktioner<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\">Observera</p>\n<p>Detta avsnitt är endast relevant om du implementerar din egen transaktionshantering. Detta problem kan inte uppstå i Djangos standardläge och <a class=\"reference internal\" href=\"#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> hanterar det automatiskt.</p>\n</aside>\n<p>Inuti en transaktion, när ett anrop till en PostgreSQL-markör ger upphov till ett undantag (vanligtvis `` IntegrityError``), kommer all efterföljande SQL i samma transaktion att misslyckas med felet ”aktuell transaktion avbryts, frågor ignoreras till slutet av transaktionsblocket”. Även om den grundläggande användningen av `` save () `` sannolikt inte kommer att ge upphov till ett undantag i PostgreSQL, finns det mer avancerade användningsmönster som kan, till exempel att spara objekt med unika fält, spara med flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">force_insert</span></code> / <code class=\"docutils literal notranslate\"><span class=\"pre\">force_update</span></code> eller anropa anpassad SQL.</p>\n<p>Det finns flera sätt att återhämta sig från den här typen av fel.</p>\n<section id=\"transaction-rollback\">\n<h4>Återställning av transaktion<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>Det första alternativet är att rulla tillbaka hela transaktionen. Till exempel:</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=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">save</span><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    <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>  <span class=\"c1\"># Could throw exception</span>\n<span class=\"k\">except</span> <span class=\"n\">IntegrityError</span><span class=\"p\">:</span>\n    <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">rollback</span><span class=\"p\">()</span>\n<span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>  <span class=\"c1\"># Succeeds, but a.save() may have been undone</span>\n</code></pre></div>\n<p>Anrop av <code class=\"docutils literal notranslate\"><span class=\"pre\">transaction.rollback()</span></code> rullar tillbaka hela transaktionen. Alla obekräftade databasoperationer kommer att gå förlorade. I det här exemplet skulle de ändringar som gjordes av <code class=\"docutils literal notranslate\"><span class=\"pre\">a.save()</span></code> gå förlorade, även om den operationen inte gav upphov till något fel i sig.</p>\n</section>\n<section id=\"savepoint-rollback\">\n<h4>Återställning av sparpunkt<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>Du kan använda :ref:` savepoints &lt;topics-db-transactions-savepoints&gt; för att styra omfattningen av en återställning. Innan du utför en databasoperation som kan misslyckas kan du ange eller uppdatera sparpunkten; på så sätt kan du, om operationen misslyckas, rulla tillbaka den enskilda felaktiga operationen i stället för hela transaktionen. Till exempel:</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=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>  <span class=\"c1\"># Succeeds, and never undone by savepoint rollback</span>\n<span class=\"n\">sid</span> <span class=\"o\">=</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">savepoint</span><span class=\"p\">()</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>  <span class=\"c1\"># Could throw exception</span>\n    <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">savepoint_commit</span><span class=\"p\">(</span><span class=\"n\">sid</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> <span class=\"n\">IntegrityError</span><span class=\"p\">:</span>\n    <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">savepoint_rollback</span><span class=\"p\">(</span><span class=\"n\">sid</span><span class=\"p\">)</span>\n<span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>  <span class=\"c1\"># Succeeds, and a.save() is never undone</span>\n</code></pre></div>\n<p>I det här exemplet kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">a.save()</span></code> inte att ångras i det fall <code class=\"docutils literal notranslate\"><span class=\"pre\">b.save()</span></code> ger upphov till ett undantag.</p>\n</section>\n</section>\n</section>","rootId":"module-django.db.transaction","toc":[{"title":"Hantering av databastransaktioner","anchor":"managing-database-transactions","children":[{"title":"Djangos standardbeteende för transaktioner","anchor":"django-s-default-transaction-behavior","children":[]},{"title":"Koppling av transaktioner till HTTP-förfrågningar","anchor":"tying-transactions-to-http-requests","children":[]},{"title":"Explicit kontroll av transaktioner","anchor":"controlling-transactions-explicitly","children":[]}]},{"title":"Autocommit","anchor":"autocommit","children":[{"title":"Varför Django använder autocommit","anchor":"why-django-uses-autocommit","children":[]},{"title":"Avaktivera transaktionshantering","anchor":"deactivating-transaction-management","children":[]}]},{"title":"Utföra åtgärder efter commit","anchor":"performing-actions-after-commit","children":[{"title":"Spara poäng","anchor":"savepoints","children":[]},{"title":"Verkställighetsordning","anchor":"order-of-execution","children":[]},{"title":"Hantering av undantag","anchor":"exception-handling","children":[]},{"title":"Tidpunkt för verkställande","anchor":"timing-of-execution","children":[]},{"title":"Användning i tester","anchor":"use-in-tests","children":[]},{"title":"Varför ingen rollback-hook?","anchor":"why-no-rollback-hook","children":[]}]},{"title":"API:er på låg nivå","anchor":"low-level-apis","children":[{"title":"Autocommit","anchor":"managing-autocommit","children":[]},{"title":"Transaktioner","anchor":"transactions","children":[]},{"title":"Spara poäng","anchor":"topics-db-transactions-savepoints","children":[]}]},{"title":"Databasspecifika anteckningar","anchor":"database-specific-notes","children":[{"title":"Sparpunkter i SQLite","anchor":"savepoints-in-sqlite","children":[]},{"title":"Transaktioner i MySQL","anchor":"transactions-in-mysql","children":[]},{"title":"Hantering av undantag inom PostgreSQL-transaktioner","anchor":"handling-exceptions-within-postgresql-transactions","children":[{"title":"Återställning av transaktion","anchor":"transaction-rollback","children":[]},{"title":"Återställning av sparpunkt","anchor":"savepoint-rollback","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.0/topics/"},{"docname":"topics/db/index","title":"Modeller och databaser","url":"/sv/6.0/topics/db/"}],"prev":{"docname":"topics/db/sql","title":"Utföra SQL-frågor i råformat","url":"/sv/6.0/topics/db/sql/"},"next":{"docname":"topics/db/multi-db","title":"Flera databaser","url":"/sv/6.0/topics/db/multi-db/"},"formats":{"html":"/sv/6.0/topics/db/transactions/","markdown":"/sv/6.0/topics/db/transactions.md","json":"/sv/6.0/topics/db/transactions.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/db/transactions.txt","official":"https://docs.djangoproject.com/sv/6.0/topics/db/transactions/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}