Sobes.tech
Junior — Middle

Կարո՞ղ է համակարգում իրականացնել ներքին գործարքներ և ինչ դեպքերում դա թույլատրելի է:

sobes.tech AI

Պատասխան AI-ից

Go-ի ստանդարտ գրադարանում (database/sql փաթեթը) ներսի տրանզակցիաները ուղղակիորեն չեն աջակցվում, քանի որ շատ տվյալների բազայի կառավարման համակարգեր (DBMS) իրականացնում են լիարժեք ներսի տրանզակցիաներ: Փոխարենը հաճախ օգտագործվում են խնայողական կետեր (savepoints), որոնք թույլ են տալիս վերադառնալ տրանզակցիայի ներսում որոշակի վիճակի:

Հնարավոր տարբերակներ՝

  • Օգտագործել savepoints, եթե այն աջակցում է DBMS-ը (օրինակ՝ PostgreSQL, MySQL): Go-ում դա կարելի է անել SQL հրամաններ SAVEPOINT, ROLLBACK TO SAVEPOINT գործադրելով:
  • Ներկառուցված ներսի տրանզակցիաների իմիտացիա՝ առանձին տրանզակցիաներով, բայց դա միշտ չէ, որ ճիշտ է բիզնես տրամաբանությունից:

Երբ թույլատրվում է՝

  • Երբ անհրաժեշտ է մասամբ վերականգնել փոփոխությունները մեծ տրանզակցիայի ներսում՝ ամբողջական վերականգնումից զատ:
  • Երբ բարդ գործողություններում, որոնցում յուրաքանչյուր փուլը կարող է առանձին վերականգնվել:

Օրինակ՝ Go-ում savepoints-ի օգտագործման:

trx, err := db.Begin()
if err != nil {
    // սխալի մշակում
}
_, err = trx.Exec("SAVEPOINT sp1")
if err != nil {
    trx.Rollback()
    return err
}
// Գործողությունների իրականացում
// Սխալի դեպքում՝
_, err = trx.Exec("ROLLBACK TO SAVEPOINT sp1")
// Շարունակել կամ ամբողջական հաստատում
err = trx.Commit()

Այսպիսով, ներսի տրանզակցիաները իրականացնում են savepoints-ով, ոչ թե ներսի Begin/Commit կանչերով։