Python Coding Academy
🐍 آموزش جامع Python — پست ۲۳۳
کنترل تراکنش با SAVEPOINT در SQLite
در پستهای قبل یاد گرفتیم با COMMIT تغییرات را ثبت و با ROLLBACK تغییرات تأییدنشده را لغو کنیم.
اما گاهی یک تراکنش شامل چند مرحله است و میخواهیم فقط بخشی از تغییرات را برگردانیم، بدون اینکه کل تراکنش لغو شود.
برای این کار از SAVEPOINT استفاده میکنیم.
🔹 ساخت Savepoint
با SAVEPOINT یک نقطه بازگشت داخل تراکنش ایجاد میکنیم:
import sqlite3
connection = sqlite3.connect("app.db")
try:
connection.execute("BEGIN")
connection.execute(
"UPDATE products SET price = ? WHERE id = ?",
(100, 1)
)
connection.execute("SAVEPOINT second_step")
connection.execute(
"UPDATE products SET price = ? WHERE id = ?",
(200, 2)
)
connection.execute("RELEASE SAVEPOINT second_step")
connection.commit()
except sqlite3.Error:
connection.rollback()
raise
finally:
connection.close()
در این مثال، ابتدا قیمت محصول اول تغییر میکند و سپس یک Savepoint ایجاد میشود.
🔹 بازگشت به Savepoint
فرض کنیم میخواهیم تغییر دوم را لغو کنیم، اما تغییر اول باقی بماند:
import sqlite3
connection = sqlite3.connect("app.db")
try:
connection.execute("BEGIN")
connection.execute(
"UPDATE products SET price = ? WHERE id = ?",
(100, 1)
)
connection.execute("SAVEPOINT second_step")
connection.execute(
"UPDATE products SET price = ? WHERE id = ?",
(200, 2)
)
connection.execute("ROLLBACK TO SAVEPOINT second_step")
connection.execute("RELEASE SAVEPOINT second_step")
connection.commit()
except sqlite3.Error:
connection.rollback()
raise
finally:
connection.close()
اینجا تغییر قیمت محصول دوم لغو میشود، اما تغییر محصول اول میتواند ثبت شود.
🔹 تفاوت سه دستور مهم
دستور
کاربرد
SAVEPOINT
ایجاد نقطه بازگشت
ROLLBACK TO SAVEPOINT
بازگشت به نقطه مشخص
RELEASE SAVEPOINT
آزاد کردن Savepoint
نکته: ROLLBACK TO SAVEPOINT تراکنش اصلی را تمام نمیکند؛ تراکنش همچنان فعال است.
همچنین RELEASE SAVEPOINT بهتنهایی تغییرات را بهصورت نهایی ثبت نمیکند؛ برای ثبت تراکنش اصلی باید از COMMIT استفاده کنیم.
⚠️ نکته مهم
اگر خطایی رخ دهد و بخواهیم کل تراکنش را لغو کنیم، میتوانیم از:
connection.rollback()
استفاده کنیم.
اما اگر فقط بخشی از عملیات باید لغو شود، SAVEPOINT کنترل دقیقتری فراهم میکند.
🧠 خلاصه
BEGIN
↓
عملیات اول
↓
SAVEPOINT
↓
عملیات دوم
↓
ROLLBACK TO SAVEPOINT
↓
ادامه تراکنش
↓
COMMIT
🎯 تمرین
برنامهای بنویس که:
یک تراکنش آغاز کند.
قیمت محصول اول را تغییر دهد.
یک Savepoint ایجاد کند.
قیمت محصول دوم را تغییر دهد.
به Savepoint برگردد تا تغییر دوم لغو شود.
تراکنش را ثبت کند.
پست ۲۳۳ از دوره جامع Python 🐍
3 ·