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