Idirbheart bunachar sonraíLink to this heading

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

Bainistiú idirbheart bunacharLink to this heading

Iompar idirbheart réamhshocraithe DjangoLink to this heading

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 HTTPLink to this heading

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.

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)Link to this definition

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

Code
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áLink to this heading

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

atomic(using=None, savepoint=True, durable=False)Link to this definition

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ú. an bloc ``atomic` neadaithe laistigh de bhealach eile ardaíonn ``Runtimeerror.

atomic is usable both as a decorator:

Code
from django.db import transaction


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

and as a context manager:

Code
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:

Code
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á.

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.

UathchomhaontúLink to this heading

Cén fáth a n-úsáideann Django autocommitLink to this heading

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, 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íghLink to this heading

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 tiomLink to this heading

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() allows you to register callbacks that will be executed after the open transaction is successfully committed:

on_commit(func, using=None, robust=False)Link to this definition

Rith feidhm, nó aon ghlaoch, chuig:func: on_commit:

Code
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:

Code
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áilteachtaLink to this heading

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:

Code
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:

Code
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íomhaitheLink to this heading

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

Láimhseáil eisceLink to this heading

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úLink to this heading

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álachaLink to this heading

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?Link to this heading

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 ísealLink to this heading

UathchomhaontúLink to this heading

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)Link to this definition
set_autocommit(autocommit, using=None)Link to this definition

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.

IdirbheartaLink to this heading

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)Link to this definition
rollback(using=None)Link to this definition

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áilteachtaLink to this heading

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)Link to this definition

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)Link to this definition

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)Link to this definition

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)Link to this definition

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)Link to this definition

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:

Code
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)Link to this definition
set_rollback(rollback, using=None)Link to this definition

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íLink to this heading

Sábháilteachta i SQLiteLink to this heading

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 MySQLLink to this heading

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 PostgreSQLLink to this heading

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, 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 idirbheartLink to this heading

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

Code
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 SavepointLink to this heading

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:

Code
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.