---
title: "Idirbheart bunachar sonraí"
version: 6.1
locale: ga
source: https://docs.djangoproject.com/ga/6.1/topics/db/transactions/
canonical: https://djangodocs.dev/ga/6.1/topics/db/transactions/
---
# Idirbheart bunachar sonraí

Tugann Django cúpla bealach duit chun a rialú conas a bhainistítear idirbhearta bunachar sonraí.

## Bainistiú idirbheart bunachar

### Iompar idirbheart réamhshocraithe Django

Is é iompar réamhshocraithe Django rith i mód autocommit. Tá gach ceist tiomanta láithreach don bhunachar sonraí, mura bhfuil idirbheart gníomhach. \<autocommit-details\>:ref: Féach thíos le haghaidh sonraí .

\<topics-db-queries-update\>Úsáideann Django idirbhearta nó pointí sábhála go huathoibríoch chun sláine oibríochtaí ORM a ráthú a dteastaíonn ceisteanna iolracha uathu, go háirithe:ref: delete () \<topics-db-queries-delete\>\`agus: ref: \`update () ceisteanna.

Django's:class: ~django.test.testcase a fhilleann rang gach tástáil in idirbheart ar chúiseanna feidhmíochta freisin.

### Idirbhearta a cheangal le hiarratais HTTP

Bealach coitianta chun idirbhearta a láimhseáil ar an ngréasán is ea gach iarratas a fhilleadh in idirbheart. Socraigh: Socrú: ATOMIC\_REQUESTS go `<DATABASE-ATOMIC_REQUESTS>True` i gcumraíocht gach bunachar sonraí ar mhaith leat an t-iompar seo a chumasú dó.

Oibríonn sé mar seo. Sula nglaonn sé ar fheidhm amharc, tosaíonn Django idirbheart. Má tháirgtear an freagra gan fadhbanna, déanann Django an t-idirbheart a dhéanamh. Má tháirgeann an dearcadh eisceacht, rollann Django an t-idirbheart ar ais.

Féadfaidh tú fo-idirbhearta a dhéanamh ag baint úsáide as pointí sábhála i do chód amharc, de ghnáth leis an mbainisteoir comhthéacs: func: atomic. Mar sin féin, ag deireadh an dearcadh, déanfar na hathruithe go léir nó aon cheann de na hathruithe a dhéanamh.

> **Warning**
>
> Cé go bhfuil simplíocht an tsamhail idirbheart seo tarraingteach, fágann sé go bhfuil sé neamhéifeachtach freisin nuair a mhéadaíonn trácht. Tá roinnt lasbhaird ag oscailt idirbheart do gach radharc. Braitheann an tionchar ar fheidhmíocht ar phatrúin cheisteanna d'iarratais agus ar cé chomh maith agus a láimhseálann do bhunachar sonraí

> **Idirbhearta agus freagraí sruthú de réir iarrat**
>
> Nuair a fhilleann amharc a:class: ~django.http.StreamInghttPresponse, is minic a fhorghníomhaítear ábhar an fhreagra cód chun an t-ábhar a ghiniúint. Ós rud é go bhfuil an dearcadh ar ais cheana féin, ritheann an cód sin lasmuigh den idirbheart.
>
> Go ginearálta, ní mholtar scríobh chuig an mbunachar sonraí agus freagra sruthú á ghiniúint, ós rud é nach bhfuil aon bhealach ciallmhar ann chun earráidí a láimhseáil tar éis tosú ag seoladh an fhreagra.

Go praiticiúil, fillteann an ghné seo gach feidhm amharc sa maisitheoir: func: atomic a thuairiscítear thíos.

Tabhair faoi deara nach bhfuil ach forghníomhú do dhearcadh faoi iúl sna hidirbhearta. Ritheann Middleware lasmuigh den idirbheart, agus mar sin déanann rindreáil freagraí teimpléid.

Nuair a bhíonn: SETTING: ATOMIC\_REQUESTS \<DATABASE-ATOMIC\_REQUESTS\>\`cumasaithe, is féidir fós tuairimí a chosc ó rith in idirbheart.

#### `non_atomic_requests(using=None)`

\<DATABASE-ATOMIC\_REQUESTS\>Déanfaidh an maisitheoir seo diúltú ar éifeacht de:setting: ATOMIC\_REQUESTS le haghaidh radharc ar leith:

```
from django.db import transaction

@transaction.non_atomic_requests
def my_view(request):
    do_stuff()

@transaction.non_atomic_requests(using="other")
def my_other_view(request):
    do_stuff_on_the_other_database()
```

Ní oibríonn sé ach má chuirtear i bhfeidhm é ar an radharc féin.

### Idirbheart a rialú go sainrá

Soláthraíonn Django API amháin chun idirbhearta bunachar sonraí a rialú.

#### `atomic(using=None, savepoint=True, durable=False)`

Is é atomicity maoin sainmhínithe idirbhearta bunachar sonraí. Ligeann atomic\` dúinn bloc cód a chruthú ina ndéantar an t-atomacht ar an mbunachar sonraí a ráthú. Má chuirtear an bloc cód i gcrích go rathúil, tá na hathruithe tiomanta don bhunachar sonraí. Má tá eisceacht ann, déantar na hathruithe a rolladh ar ais.

Is féidir bloic atomic\` a neadú. Sa chás seo, nuair a chríochnaíonn bloc istigh go rathúil, is féidir a éifeachtaí a rolladh ar ais fós má ardaítear eisceacht sa bhloc seachtrach ag pointe níos déanaí.

Uaireanta bíonn sé úsáideach a chinntiú gurb é bloc ```atomic` an bloc `atomic` is seachtrach i gcónaí, ag cinntiú go ndéantar aon athruithe bunachar sonraí nuair a bhíonn an bloc amach gan earráidí. Tugtar marthanacht air seo agus is féidir é a bhaint amach trí “durable=True” a shocrú. Má tá an bloc ``atomic` neadaithe laistigh de bhealach eile ardaíonn sé ``Runtimeerror```.

`atomic` is usable both as a [decorator](https://docs.python.org/3/glossary.html#term-decorator):

```
from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()
```

and as a [context manager](https://docs.python.org/3/glossary.html#term-context-manager):

```
from django.db import transaction

def viewfunc(request):
    # This code executes in autocommit mode (Django's default).
    do_stuff()

    with transaction.atomic():
        # This code executes inside a transaction.
        do_more_stuff()
```

Ceadaíonn timfhilleadh `atomic` i mbloc trialachta/seachas amháin go ndéanfar earráidí sláine a láimhseáil nádúrtha:

```
from django.db import IntegrityError, transaction

@transaction.atomic
def viewfunc(request):
    create_parent()

    try:
        with transaction.atomic():
            generate_relationships()
    except IntegrityError:
        handle_exception()

    add_children()
```

Sa sampla seo, fiú má tá earráid bunachar sonraí ina chúis le generate\_relations () \`\`trí shrianadh sláine a bhriseadh, is féidir leat ceisteanna a fhorghníomhú i \`add\_children ()\`, agus tá na hathruithe ó ```create_parent () ``fós ann agus ceangailte leis an idirbheart céanna. Tabhair faoi deara go mbeidh aon oibríochtaí a dhéanfar iarracht i `generate_relations () ``rolladh ar ais go sábháilte cheana féin nuair a thugtar ``handle_exception ()```, ionas gur féidir leis an láimhseálaí eisceachta oibriú ar an mbunachar sonraí más gá.

> **Seachain eisceachtaí a ghabháil taobh istigh de atomic!**
>
> Agus tú ag imeacht as bloc atomic\`, féachann Django ar an bhfuil sé ag imeacht de ghnáth nó le heisceacht chun a chinneadh an ndéanfaidh sé tiomantas nó rolladh siar. Má ghlacann tú agus má láimhseálann tú eisceachtaí taobh istigh de bhloc atomic, féadfaidh tú a cheilt ó Django go bhfuil fadhb tharla. D'fhéadfadh iompar gan choinne a bheith mar thoradh air seo.
>
> Is imní é seo den chuid is mó le haghaidh: exc: ~django.db.databaseError agus a fho-aicmí mar: exc: ~django.db.integrityError. Tar éis earráid den sórt sin, bristear an t-idirbheart agus déanfaidh Django rolladh ar ais ag deireadh an bhloc atomic. Má dhéanann tú iarracht ceisteanna bunachar sonraí a reáchtáil sula dtarlaíonn an rolladh ar ais, ardóidh Django a:class: ~django.db.transaction.transactionManagementError. D'fhéadfá teacht ar an iompar seo freisin nuair a ardaíonn láimhseálaí comhartha a bhaineann le ORM eisceacht.
>
> Tá an bealach ceart chun earráidí bunachar sonraí a ghabháil timpeall ar bhloc atomic\` mar a thaispeántar thuas. Más gá, cuir bloc breise atomic\` leis chun na críche seo. Tá buntáiste eile ag an bpatrún seo: déanann sé teorannú go sainráite cé na hoibríochtaí a rollófar ar ais má tharlaíonn eisceacht.
>
> Má ghlacann tú eisceachtaí arna ardú ag ceisteanna amh SQL, tá iompar Django neamhshonraithe agus ag brath ar bhunachar sonraí.

> **B'fhéidir go mbeidh ort stát an aip a chur ar ais de láimh agus idirbheart á rolladh ar ais.**
>
> Ní chuirfear luachanna réimsí samhail ar ais nuair a tharlaíonn aistriú idirbheart. D'fhéadfadh stát samhail neamhchomhsheasmhach a bheith mar thoradh air seo mura gcuireann tú na luachanna réimse bunaidh ar ais
>
> Mar shampla, mar gheall ar `MyModel` le réimse `gníomha`, cinntíonn an snippet seo go n-úsáideann an seiceáil if obj.active\` ag an deireadh an luach ceart má theipeann nuashonrú `gníomha` go True\` san idirbheart:
>
> ```
> from django.db import DatabaseError, transaction
>
> obj = MyModel(active=False)
> obj.active = True
> try:
>     with transaction.atomic():
>         obj.save()
> except DatabaseError:
>     obj.active = False
>
> if obj.active:
>     ...
> ```
>
> Baineann sé seo freisin le haon mheicníocht eile a d'fhéadfadh stát aip a shealbhú, mar shampla caching nó athróga domhanda. Mar shampla, má nuashonraíonn an cód sonraí sa taisce go réamhghníomhach tar éis réad a shábháil, moltar úsáid:ref: transaction.on\_commit () \<performing-actions-after-commit\>\`ina ionad sin, chun athruithe taisce a chur siar go dtí go ndéanfar an t-idirbheart i ndáiríre.

D'fhonn atomacht a ráthú, déanann atomic\` roinnt APIs a dhíchumasú. Ardóidh iarracht staid uathchomhcheangail an nasc bunachar sonraí a thiomantas, a rolladh siar nó a athrú laistigh de bhloc atomic, ardóidh eisceacht.

Glacann ```atomic` argóint ``úsáid``` ar chóir gurb é ainm bunachar sonraí. Mura gcuirtear an argóint seo ar fáil, úsáideann Django an bunachar sonraí "réamhshocraithe”.

Faoin gcochall, cód bainistíochta idirbheart Django:

- osclaíonn sé idirbheart agus tú ag dul isteach sa bhloc “atomach” is seachtrach;
- cruthaíonn sé pointe sábhála agus tú ag dul isteach i mbloc atomic\` istigh;
- scaoileann nó rollaíonn sé ar ais chuig an bpointe sábhála agus tú ag imeacht as bloc istigh;
- geallann nó rollann siar an idirbheart agus é ag imeacht an bhloc is seachtrach.

Is féidir leat cruthú pointí sábhála do bhloic istigh a dhíchumasú tríd an argóint `savepoint` a shocrú go `False`. Má tharlaíonn eisceacht, déanfaidh Django an rolladh siar agus é ag imeacht an chéad bhloc tuismitheora le pointe sábhála má tá ceann ann, agus an bloc is seachtrach a shlí eile. Tá atomacht fós ráthaithe ag an idirbheart seachtrach. Níor cheart an rogha seo a úsáid ach amháin má tá laochaird na bpointí sábhála le feiceáil. Tá an mhíbhuntáiste aige an láimhseáil earráide a thuairiscítear thuas

Féadfaidh tú atomic\` a úsáid nuair a mhúchtar autocommit. Ní úsáidfidh sé ach pointí sábhála, fiú don bhloc is seachtrach.

> **Creithniúcháin**
>
> Tá costas feidhmíochta ag idirbhearta oscailte do do fhreastalaí bunachar Chun an lascaire seo a íoslaghdú, coinnigh d'idirbhearta chomh gearr agus is féidir Tá sé seo tábhachtach go háirithe má tá tú ag úsáid: func: atomic i bpróisis fhada, lasmuigh de thimthriall iarrata/freagartha Django.

## Uathchomhaontú

### Cén fáth a n-úsáideann Django autocommit

Sna caighdeáin SQL, tosaíonn gach ceist SQL idirbheart, mura bhfuil ceann gníomhach cheana féin. Caithfear idirbhearta den sórt sin a dhéanamh go sainráite nó a rolladh ar ais.

Níl sé seo áisiúil i gcónaí d'fhorbróirí feidhmchlár. Chun an fhadhb seo a mhaolú, soláthraíonn an chuid is mó de na bunachair sonraí modh Nuair a dhéantar autocommit a chasadh air agus nach bhfuil aon idirbheart gníomhach, filtear gach ceist SQL ina idirbheart féin. Is é sin le rá, ní amháin go dtosaíonn gach ceist den sórt sin idirbheart, ach déantar an t-idirbheart tiomanta nó a rolladh ar ais go huathoibríoch freisin, ag brath ar éirigh leis an bhfiosrú.

[**PEP 249**](https://peps.python.org/pep-0249/), the Python Database API Specification v2.0, requires autocommit to
be initially turned off. Django overrides this default and turns autocommit
on.

Chun é seo a sheachaint, is féidir leat: ref: bainistíocht an idirbheart a dhíghníomhachtú \<deactivate-transaction-management\>, ach ní mholtar é.

### Bainistíocht idirbheart a dhígh

Is féidir leat bainistíocht idirbheart Django a dhíchumasú go hiomlán do bhunachar sonraí ar leith trí shocrú: “AUTOCOMMIT” go False \<DATABASE-AUTOCOMMIT\>\`ina chumraíocht. Má dhéanann tú é seo, ní chumasóidh Django autocommit, agus ní dhéanfaidh sé aon gealltanais. Gheobhaidh tú iompar rialta leabharlann bunachar sonraí bunúsach.

Éilíonn sé seo ort gach idirbheart a dhéanamh go sainráite, fiú iad siúd a thosaigh Django nó ag leabharlanna tríú páirtí. Dá bhrí sin, is fearr é seo a úsáid i gcásanna inar mian leat do mheánearraí rialaithe idirbhearta féin a reáchtáil nó rud éigin an-aisteach a dhéanamh.

## Gníomhartha a dhéanamh tar éis tiom

Uaireanta ní mór duit gníomh a dhéanamh a bhaineann leis an idirbheart reatha bunachar sonraí, ach amháin má dhéanann an t-idirbheart go rathúil. D'fhéadfadh tasc cúlra, fógra ríomhphoist, nó neamhbhailíú taisce a bheith san áireamh samplaí.

[`on_commit()`](#django.db.transaction.on_commit) allows you to register callbacks that will be executed after
the open transaction is successfully committed:

#### `on_commit(func, using=None, robust=False)`

Rith feidhm, nó aon ghlaoch, chuig:func: on\_commit:

```
from django.db import transaction

def send_welcome_email(): ...

transaction.on_commit(send_welcome_email)
```

Ní chuirfear aon argóintí ar ais, ach is féidir leat iad a cheangal le:func: functools.partial:

```
from functools import partial

for user in users:
    transaction.on_commit(partial(send_invite_email, user=user))
```

Glaofar ar ais tar éis don idirbheart oscailte a dhéanamh go rathúil. Má dhéantar an t-idirbheart a rolladh ar ais ina ionad sin (de ghnáth nuair a ardaítear eisceacht neamh-láimhseáilte i bhloc:func: atomic), caithfear an glaoch ar ais, agus ní ghlaofar air riamh.

Má ghlaonn tú ar on\_commit () cé nach bhfuil idirbheart oscailte ann, déanfar an glaoch ar ais a fhorghníomhú láithreach.

Uaireanta bíonn sé úsáideach aisghlaonna a chlárú a d'fhéadfadh teipeadh orthu. Trí `robust=True` is féidir leis na chéad ghlaonna eile a fhorghníomhú fiú má chaitheann an ceann reatha eisceacht. Gafa agus logáiltear gach earráid a dhíorthaítear ó rang ```Exception` Python agus logáiltear chuig an logger ``django.db.backends.base```.

Is féidir leat: meth: .testcase.captureonCommitCallbacks a úsáid chun glaonna a chláraithe le: func: on\_commit a thástáil.

### Sábháilteachta

Láimhseáiltear pointí sábhála (ie neasted:func: bloic atomic) i gceart. Is é sin, glaofar ar:func: on\_commit inghlaonta tar éis sábhála (i mbloc neastad:func: atomic) tar éis an t-idirbheart seachtrach a dhéanamh, ach ní má tharla rolladh ar ais chuig an bpointe sábhála sin nó aon phointe sábhála roimhe seo le linn an idirbheart:

```
with transaction.atomic():  # Outer atomic, start a new transaction
    transaction.on_commit(foo)

    with transaction.atomic():  # Inner atomic block, create a savepoint
        transaction.on_commit(bar)

# foo() and then bar() will be called when leaving the outermost block
```

Ar an láimh eile, nuair a dhéantar pointe sábhála a rolladh ar ais (mar gheall ar eisceacht a ardaítear), ní ghlaofar ar an glaoch istigh:

```
with transaction.atomic():  # Outer atomic, start a new transaction
    transaction.on_commit(foo)

    try:
        with transaction.atomic():  # Inner atomic block, create a savepoint
            transaction.on_commit(bar)
            raise SomeError()  # Raising an exception - abort the savepoint
    except SomeError:
        pass

# foo() will be called, but not bar()
```

### Ordú forghníomhaithe

Déantar feidhmeanna ar thiomantas d'idirbheart ar leith a fhorghníomhú san ord a cláraíodh iad.

### Láimhseáil eisce

Má ardaíonn feidhm ar thiomantas amháin atá cláraithe le robust=false laistigh d'idirbheart ar leith eisceacht gan ghabháil, ní rithfidh aon fheidhmeanna cláraithe níos déanaí san idirbheart céanna sin. Is é seo an t-iompar céanna agus dá gcuirfeá na feidhmeanna a fhorghníomhú go seicheamhach tú féin gan: func: on\_commit.

### Uainiú forghníomhú

Cuirtear do ghlaonna a fhorghníomhacht\* tar éis tiomantas rathúil, mar sin ní chuirfidh teip ar ais glaonna faoi deara go dtiocfaidh an t-idirbheart ar ais. Déantar iad a fhorghníomhú go coinníollach ar rath leis an idirbheart, ach níl\* cuid\* den idirbheart iad. Maidir leis na cásanna úsáide atá beartaithe (fógraí ríomhphoist, tascanna cúlra, srl.), Ba chóir go mbeadh sé seo go breá. Mura bhfuil sé (má tá do ghníomh leantach chomh ríthábhachtach gur chóir go gciallódh a theip go dteipfeadh an idirbheart féin), ansin níl tú ag iarraidh an crúca:func: on\_commit a úsáid. \<249 #optional -two-phase-commit-extensions\>Ina áit sin, b'fhéidir gur mhaith leat coimite dhá chéim' \_ mar thacaíocht prótacal Tiomanta Dhá Chéim psycopg \<psycopg:two-phase-commit\>\`agus an:pep: Síntí Tiomanta Dhá Chéim roghnach sa sonraíocht Python DB-API '.

Ní reáchtáiltear aisghlaonna go dtí go ndéantar autocommit a athchóiriú ar an nasc tar éis an tiomanta (mar shlí eile d'osclódh aon cheisteanna a dhéantar i aisghlao idirbheart intuigthe, ag cosc ar an nasc dul ar ais isteach i mód autocommit).

Nuair atá i mód autocommit agus lasmuigh de bhloc:func: atomic, rithfidh an fheidhm láithreach, ní ar thiomantas.

\<DATABASE-ATOMIC\_REQUESTS\>Ní oibríonn feidhmeanna ar chomhcheangal ach le: ref: modh autocommit \`agus \<managing-autocommit\>la:func: \`atomic (nó: setting: ATOMIC\_REQUESTS) API idirbheart. Glaoi:func: on\_commit nuair a dhéantar autocommit míchumasaithe agus nach bhfuil tú laistigh de bhloc adamhach beidh earráid mar thoradh air.

### Úsáid i dtástálacha

Django's:class: ~django.test.testcase fillteann rang gach tástáil in idirbheart agus rollaíonn sé an t-idirbheart sin ar ais tar éis gach tástála, d'fhonn aonrú tástála a sholáthar. Ciallaíonn sé seo nach ndéantar aon idirbheart riamh i ndáiríre, mar sin ní reáchtálfar d'aisghlaonna: func: on\_commit riamh.

Is féidir leat an teorannú seo a shárú trí:meth: .testcase.captureonCommitCallbacks a úsáid. Gabhann sé seo d'aisghlaonna: func: on\_commit i liosta, rud a ligeann duit dearbhú a dhéanamh orthu, nó aithris a dhéanamh ar an idirbheart a dhéantar trí ghlaoch orthu.

Bealach eile chun an teorannú a shárú ná úsáid: class: ~django.test.transactionTestCase in ionad:class: ~django.test.testcase. Ciallaíonn sé seo go bhfuil d'idirbhearta tiomanta, agus rithfidh na haisghlaonna. Mar sin féin: Sruthlaíonn Class: ~Django.Test.TransactionTestCase an bunachar sonraí idir tástálacha, atá i bhfad níos moille ná: aicme: ~django.test.testcase aonrú.

### Cén fáth nach bhfuil crúca rollta ar ais?

Tá sé níos deacra crúca rollta a chur i bhfeidhm go láidir ná crúca tiomanta, ós rud é gur féidir le rudaí éagsúla a bheith ina chúis le rolladh intuigthe.

Mar shampla, má thiteann do nasc bunachar sonraí toisc go maraíodh do phróiseas gan deis dúnadh go grásta, ní rithfidh do chrúca rollta riamh.

Ach tá réiteach ann: in ionad rud éigin a dhéanamh le linn an bhloc adamhach (idirbheart) agus ansin é a dhíchur má theipeann ar an idirbheart, bain úsáid as: func: on\_commit chun moill a dhéanamh ar é sa chéad áit go dtí tar éis éireoidh leis an idirbheart. Tá sé i bhfad níos éasca rud a rinne tú riamh a chealú sa chéad áit!

## APIs ar leibhéal íseal

> **Warning**
>
> Is fearr i gcónaí:func: atomic más féidir ar chor ar bith. Déanann sé cuntas ar shainiúlachtaí gach bunachar sonraí agus cuireann sé cosc ar oibríochtaí neamhbhailí.
>
> Níl na APIs ar leibhéal íseal úsáideach ach má tá do bhainistíocht idirbheart féin á chur i bhfeidhm agat.

### Uathchomhaontú

Soláthraíonn Django API sa mhodúl:mod: django.db.transaction chun staid autocommit gach nasc bunachar sonraí a bhainistiú.

#### `get_autocommit(using=None)`

#### `set_autocommit(autocommit, using=None)`

Glacann na feidhmeanna seo argóint úsáid ar chóir gurb é ainm bunachar sonraí. Mura gcuirtear é ar fáil, úsáideann Django an bunachar sonraí "réamhshocraithe”.

Cuirtear Autocommit air ar dtús. Má chasann tú as é, tá sé de fhreagracht ort é a chur ar ais.

Nuair a chasann tú autocommit as, gheobhaidh tú iompar réamhshocraithe d'oiriúnaitheoir bunachar sonraí, agus ní chabhróidh Django leat. Cé go sonraítear an t-iompar sin in:pep: 249, ní bhíonn cur i bhfeidhm oiriúnaitheoirí comhsheasmhach lena chéile i gcónaí. Déan athbhreithniú cúramach ar dhoiciméadú an chuibheora atá á úsáid agat

Ní mór duit a chinntiú nach bhfuil aon idirbheart gníomhach, de ghnáth trí a: func: commit nó a:func: rollback a eisiúint, sula ndéanann tú autocommit ar ais.

Diúltóidh Django autocommit a mhúchadh nuair a bheidh bloc: func: atomic gníomhach, toisc go mbriseadh sé sin atomacht.

### Idirbhearta

Is tacar adamhach de cheisteanna bunachar sonraí é idirbheart. Fiú má tharlaíonn do chlár, ráthaíonn an bunachar sonraí go gcuirfear na hathruithe go léir i bhfeidhm, nó aon cheann acu.

Ní sholáthraíonn Django API chun idirbheart a thosú. Is é an bealach a bhfuiltear ag súil leis chun idirbheart a thosú ná autocommit a dhíchumasú le:func: set\_autocommit .

Nuair a bheidh tú in idirbheart, is féidir leat na hathruithe a rinne tú a chur i bhfeidhm go dtí an pointe seo le:func: commit, nó iad a chealú le:func: rollback. Sainmhínítear na feidhmeanna seo in:mod: django.db.transaction.

#### `commit(using=None)`

#### `rollback(using=None)`

Glacann na feidhmeanna seo argóint úsáid ar chóir gurb é ainm bunachar sonraí. Mura gcuirtear é ar fáil, úsáideann Django an bunachar sonraí "réamhshocraithe”.

Diúltóidh Django tiomantas nó rolladh siar nuair a bheidh bloc: func: atomic gníomhach, toisc go mbriseadh sé sin atomacht.

### Sábháilteachta

Is marcóir laistigh d'idirbheart é pointe sábhála a chuireann ar do chumas cuid d'idirbheart a rolladh siar, seachas an t-idirbheart iomlán. Tá Savepoints ar fáil leis na cúltaca SQLite, PostgreSQL, Oracle, agus MySQL (agus an t-inneall stórála InnoDB á úsáid agat). Soláthraíonn cúltaca eile na feidhmeanna sábhála, ach is oibríochtaí folamh iad - ní dhéanann siad aon rud i ndáiríre.

Níl pointí sábhála úsáideach go háirithe má tá tú ag úsáid autocommit, iompar réamhshocraithe Django. Mar sin féin, nuair a osclaíonn tú idirbheart le:func: atomic, tógann tú sraith oibríochtaí bunachar sonraí ag fanacht le tiomantas nó rolladh siar. Má eisíonn tú rolladh ar ais, déantar an t-idirbheart iomlán a rolladh ar ais. Soláthraíonn Savepoints an cumas rolladh mionghráinneach a dhéanamh, seachas an rolladh iomlán a dhéanfadh transaction.rollback () .

Nuair a dhéantar an maisitheoir:func: atomic neadaithe, cruthaíonn sé pointe sábhála chun tiomantas páirteach nó rolladh siar a cheadú. Spreagtar go láidir duit: func: atomic a úsáid seachas na feidhmeanna a thuairiscítear thíos, ach tá siad fós mar chuid den API poiblí, agus níl aon phlean ann chun iad a dhíchur.

Each of these functions takes a `using` argument which should be the name of
a database for which the behavior applies. If no `using` argument is
provided then the `"default"` database is used.

Tá pointí sábhála á rialú ag trí fheidhm in:mod: django.db.transaction:

#### `savepoint(using=None)`

> **Deprecated since Django 6.1**
>
> Deprecated since version 6.1: `savepoint` has been renamed to `savepoint_create`.

Cruthaíonn sé pointe sábhála nua. Marcann sé seo pointe san idirbheart ar eol go bhfuil i stát “maith”. Tugann an t-aitheantas sábhála ar ais (sid\`).

#### `savepoint_create(using=None)`

> **New in Django 6.1**

Cruthaíonn sé pointe sábhála nua. Marcann sé seo pointe san idirbheart ar eol go bhfuil i stát “maith”. Tugann an t-aitheantas sábhála ar ais (sid\`).

#### `savepoint_commit(sid, using=None)`

Scaoileann sé savepoint `sid`. Tá na hathruithe a rinneadh ó cruthaíodh an pointe sábhála mar chuid den idirbheart.

#### `savepoint_rollback(sid, using=None)`

Rollaíonn sé an t-idirbheart ar ais chun sábháil `sid`.

Ní dhéanann na feidhmeanna seo aon rud mura dtacaítear le pointí sábhála nó má tá an bunachar sonraí i mód uathchomhcheangail.

Ina theannta sin, tá feidhm fóntais ann:

#### `clean_savepoints(using=None)`

Athshocraíonn sé an cuntar a úsáidtear chun IDanna uathúla sábhála a ghiniúint.

Taispeánann an sampla seo a leanas úsáid pointí sábhála:

```
from django.db import transaction

# open a transaction
@transaction.atomic
def viewfunc(request):
    a.save()
    # transaction now contains a.save()

    sid = transaction.savepoint_create()

    b.save()
    # transaction now contains a.save() and b.save()

    if want_to_keep_b:
        transaction.savepoint_commit(sid)
        # open transaction still contains a.save() and b.save()
    else:
        transaction.savepoint_rollback(sid)
        # open transaction now contains only a.save()
```

Féadfar pointí sábhála a úsáid chun aisghabháil ó earráid bunachar sonraí trí aistriú páirteach a dhéanamh. Má tá tú ag déanamh seo taobh istigh de bhloc:func: atomic, déanfar an bloc iomlán a rolladh ar ais fós, toisc nach bhfuil a fhios aige gur láimhseáil tú an cás ag leibhéal níos ísle! Chun é seo a chosc, is féidir leat an t-iompar rollta a rialú leis na feidhmeanna seo a leanas.

#### `get_rollback(using=None)`

#### `set_rollback(rollback, using=None)`

Cuireann an bhratach rollta ar ais go `True`, cuirtear isteach ar ais agus tú ag imeacht an bhloc adamhach is taobh istigh. D'fhéadfadh sé seo a bheith úsáideach chun rolladh a spreagadh gan eisceacht a ardú.

Cuireann é a shocrú go `False` cosc ar rolladh den sórt sin. Sula ndéanann tú é sin, déan cinnte go bhfuil an t-idirbheart a rolladh ar ais go pointe sábhála maith ar eolas laistigh den bhloc adamhach reatha! Seachas sin tá tú ag briseadh atomacht agus d'fhéadfadh éilliú sonraí tarlú.

## Nótaí sonracha bunachar sonraí

### Sábháilteachta i SQLite

Cé go dtacaíonn SQLite le pointí sábhála, ní fhágann locht i ndearadh an mhodúil: mod: sqlite3 is ar éigean iad inúsáidte.

Nuair a dhéantar autocommit cumasaithe, ní bhíonn ciall ag pointí sábhála. Nuair a bhíonn sé díchumasaithe, tiomhann :mod: sqlite3 go hinneach roimh ráitis savepoint. (Go deimhin, déanann sé tiomantas roimh aon ráiteas seachas `SELECT`, INSERT\`, UPDATE\`, DELETE\` agus `REPLACE`.) Tá dhá iarmhairtí ag an fabht seo:

- Ní féidir na APIs leibhéal íseal le haghaidh pointí sábhála inúsáidte ach taobh istigh d'idirbheart i.e. taobh istigh de bhloc:func: atomic.
- Tá sé dodhéanta: func: atomic a úsáid nuair a mhúchtar autocommit.

### Idirbhearta i MySQL

Má tá MySQL á úsáid agat, d'fhéadfadh nó nach dtacaíonn do tháblaí le hidirbhearta; braitheann sé ar do leagan MySQL agus ar na cineálacha tábla atá á úsáid agat. (Le “cineálacha tábla,” ciallaímid rud éigin cosúil le “InnoDB” nó “MyISAM”.) Tá tréithe idirbheart MySQL lasmuigh de raon feidhme an ailt seo, ach tá faisnéis faoi idirbhearta MySQL \_ ag an suíomh MySQL.

Mura dtacaíonn do shocrú MySQL\* le hidirbhearta, ansin feidhmeoidh Django i gcónaí i mód autocommit: déanfar ráitis a fhorghníomhú agus a thiomnamh a luaithe a ghlaofar orthu. Má thacaíonn do shocrú MySQL\* le hidirbhearta, láimhseálfaidh Django idirbhearta mar a mhínítear sa doiciméad seo.

### Láimhseáil eisceachtaí laistigh d'idirbhearta PostgreSQL

> **Note**
>
> Níl an chuid seo ábhartha ach amháin má tá do bhainistíocht idirbheart féin á chur i bhfeidhm agat. Ní féidir leis an bhfadhb seo tarlú i mód réamhshocraithe Django agus láimhseálann: func: atomic é go huathoibríoch.

Taobh istigh d'idirbheart, nuair a ardaíonn glao chuig cúrsóir PostgreSQL eisceacht (de ghnáth `IntegrityError`), teipeann ar gach SQL ina dhiaidh sin san idirbheart céanna leis an earráid “cuirtear an t-idirbheart reatha, neamhaird ar cheisteanna go dtí deireadh an bhloc idirbheart”. Cé nach dócha go n-ardóidh úsáid bhunúsach ````save () ``eisceacht i PostgreSQL, tá patrúin úsáide níos airde ann a d'fhéadfadh, mar shampla rudaí a shábháil le réimsí uathúla, sábháil ag baint úsáide as an bhratach ```force_insert````/`force_updat`, nó SQL saincheaptha a ghairm.

Tá bealaí éagsúla ann chun aisghabháil ón gcineál seo earráide.

#### Aisghabháil idirbheart

Is é an chéad rogha an t-idirbheart iomlán a rolladh ar ais. Mar shampla:

```
a.save()  # Succeeds, but may be undone by transaction rollback
try:
    b.save()  # Could throw exception
except IntegrityError:
    transaction.rollback()
c.save()  # Succeeds, but a.save() may have been undone
```

Ag glaoch ar transaction.rollback () rollann an t-idirbheart iomlán ar ais. Caillfear aon oibríochtaí bunachar sonraí neamhthiomanta. Sa sampla seo, caillfeadh na hathruithe a rinne a.save () \`, cé nach n-ardaigh an oibríocht sin aon earráid féin.

#### Aisghabháil Savepoint

Is féidir leat:ref: savepoints \<topics-db-transactions-savepoints\>\`a úsáid chun méid rollta a rialú. Sula ndéanann tú oibríocht bunachar sonraí a d'fhéadfadh teipeadh air, is féidir leat an pointe sábhála a shocrú nó a nuashonrú; ar an mbealach sin, má theipeann ar an oibríocht, is féidir leat an oibríocht ciontaithe aonair a rolladh ar ais, seachas an t-idirbheart iomlán. Mar shampla:

```
a.save()  # Succeeds, and never undone by savepoint rollback
sid = transaction.savepoint_create()
try:
    b.save()  # Could throw exception
    transaction.savepoint_commit(sid)
except IntegrityError:
    transaction.savepoint_rollback(sid)
c.save()  # Succeeds, and a.save() is never undone
```

Sa sampla seo, ní dhéantar ```a.save () ``ar ais sa chás ina ndéanann ``b.save ()``` eisceacht.
