Sobes.tech
Junior — Middle

Sistemdə iç-içə əməliyyatlar həyata keçirmək mümkündürmü və hansı hallarda bu qəbul edilir?

sobes.tech Süni İntellekt

AI-dan cavab

Go-nun standart kitabxanasında (database/sql paketinde) iç-içə tranzaksiyalar birbaşa dəstəklənmir, çünki çoxlu məlumat bazası idarəetmə sistemləri (DBMS) tam iç-içə tranzaksiyaları həyata keçirmir. Əvəzinə, tez-tez qurtarma nöqtələri (savepoints) istifadə olunur, bunlar tranzaksiya daxilində müəyyən bir vəziyyətə qayıtmağa imkan verir.

Mümkün variantlar:

  • Əgər DBMS onları dəstəkləyirsə, savepoints istifadə etmək (məsələn, PostgreSQL, MySQL). Go-da bu, SQL əmrlərini SAVEPOINT, ROLLBACK TO SAVEPOINT icra etməklə həyata keçirilə bilər.
  • İç-içə tranzaksiyaları ayrı tranzaksiyalar vasitəsilə təqlid etmək, amma bu hər zaman biznes məntiqi baxımından düzgün olmaya bilər.

Nə zaman icazə verilir:

  • Böyük tranzaksiya daxilində dəyişiklikləri qismən geri almaq lazım olduqda, bütün tranzaksiyanı tamamilə ləğv etmədən.
  • Çox mərhələli mürəkkəb əməliyyatlarda, hər mərhələni ayrıca geri almaq mümkün olduqda.

Go-da savepoints istifadəsinin nümunəsi:

trx, err := db.Begin()
if err != nil {
    // xəta ilə işləmə
}
_, err = trx.Exec("SAVEPOINT sp1")
if err != nil {
    trx.Rollback()
    return err
}
// Əməliyyatların yerinə yetirilməsi
// Xəta baş verərsə:
_, err = trx.Exec("ROLLBACK TO SAVEPOINT sp1")
// Davam etmək və ya tam commit etmək
err = trx.Commit()

Beləliklə, iç-içə tranzaksiyalar savepoints vasitəsilə həyata keçirilir, iç-içə Begin/Commit çağırışları ilə deyil.