ธุรกรรมและตัวจัดการบริบท
ยืนยันหรือย้อนกลับธุรกรรมอย่างปลอดภัย
ธุรกรรมและตัวจัดการบริบท เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
ธุรกรรมคืออะไร
ธุรกรรม คือการรวมคำสั่งหลายรายการไว้ด้วยกัน เพื่อให้คำสั่งทั้งหมดสำเร็จหรือล้มเหลวไปพร้อมกัน วิธีนี้ช่วยรักษาความสอดคล้องของข้อมูล
SQLite จะเริ่มธุรกรรมโดยอัตโนมัติก่อนคำสั่งที่เปลี่ยนแปลงข้อมูล
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
print('Table ready for transactions')
conn.close()ยืนยันเพื่อบันทึก
การเปลี่ยนแปลงจะยังไม่ถาวรจนกว่าคุณจะเรียกใช้ conn.commit() ก่อนหน้านั้น การเปลี่ยนแปลงจะมีอยู่เฉพาะในธุรกรรมปัจจุบัน
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.commit()
print('Committed')
conn.close()การย้อนกลับการเปลี่ยนแปลง
conn.rollback() ยกเลิกการเปลี่ยนแปลงทั้งหมดนับจากการยืนยันครั้งล่าสุด ให้ใช้เมื่อเกิดข้อผิดพลาด
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
conn.commit()
cur.execute('INSERT INTO accounts (balance) VALUES (100)')
conn.rollback()
cur.execute('SELECT COUNT(*) FROM accounts')
print('Rows after rollback:', cur.fetchone()[0])
conn.close()การโอนเงิน
ธุรกรรมมีประโยชน์อย่างยิ่งเมื่อการแก้ไขหลายรายการต้องสอดคล้องกัน การโอนเงินของธนาคารจะหักเงินจากบัญชีหนึ่งและเพิ่มเงินไปยังอีกบัญชีหนึ่ง การดำเนินการทั้งสองอย่างต้องเกิดขึ้นพร้อมกัน หรือไม่เกิดขึ้นเลย
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (2, 50)')
cur.execute('UPDATE accounts SET balance = balance - 30 WHERE id = 1')
cur.execute('UPDATE accounts SET balance = balance + 30 WHERE id = 2')
conn.commit()
cur.execute('SELECT id, balance FROM accounts')
print(cur.fetchall())
conn.close()การจัดการข้อผิดพลาดด้วย try/except
ห่อธุรกรรมไว้ใน try/except เมื่อเกิดข้อผิดพลาด ให้ย้อนกลับการเปลี่ยนแปลง เพื่อไม่ให้การเปลี่ยนแปลงเพียงบางส่วนทำให้ข้อมูลเสียหาย
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
try:
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 100)')
cur.execute('INSERT INTO accounts (id, balance) VALUES (1, 200)')
conn.commit()
except sqlite3.IntegrityError:
conn.rollback()
print('Rolled back after error')
conn.close()การเชื่อมต่อในฐานะตัวจัดการบริบท
การใช้ with conn: จะยืนยันธุรกรรมโดยอัตโนมัติเมื่อสำเร็จ และย้อนกลับการเปลี่ยนแปลงหากเกิดข้อยกเว้นภายในบล็อก
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)')
with conn:
conn.execute('INSERT INTO accounts (balance) VALUES (100)')
print('Auto-committed via with block')
conn.close()การย้อนกลับอัตโนมัติเมื่อเกิดข้อยกเว้น
หากบล็อก with conn: ทำให้เกิดข้อยกเว้น ธุรกรรมจะถูกย้อนกลับโดยอัตโนมัติ โปรดสังเกตว่าการเชื่อมต่อเองยังคงเปิดอยู่
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE accounts (id INTEGER PRIMARY KEY)')
try:
with conn:
conn.execute('INSERT INTO accounts (id) VALUES (1)')
conn.execute('INSERT INTO accounts (id) VALUES (1)')
except sqlite3.IntegrityError:
print('Block rolled back automatically')
count = conn.execute('SELECT COUNT(*) FROM accounts').fetchone()[0]
print('Rows:', count)
conn.close()closing() สำหรับการเชื่อมต่อ
ตัวช่วย contextlib.closing รับประกันว่าจะมีการเรียกใช้ close() เมื่อบล็อกสิ้นสุดลง ทำให้การเชื่อมต่อถูกปล่อย
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
conn.execute('CREATE TABLE t (id INTEGER)')
print('Used inside closing()')
print('Connection closed automatically')การใช้รูปแบบทั้งสองร่วมกัน
ซ้อน with conn: ไว้ภายใน closing(...) เพื่อจัดการทั้งธุรกรรมและการปิดการเชื่อมต่อ
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(':memory:')) as conn:
conn.execute('CREATE TABLE t (id INTEGER, v TEXT)')
with conn:
conn.execute('INSERT INTO t VALUES (1, ?)', ('hello',))
print(conn.execute('SELECT * FROM t').fetchall())isolation_level
isolation_level ของการเชื่อมต่อจะควบคุมเวลาที่ธุรกรรมเริ่มต้น ค่าเริ่มต้นจะให้ SQLite จัดการเอง ส่วนการตั้งค่าเป็น None จะเปิดใช้โหมดการยืนยันโดยอัตโนมัติ
import sqlite3
conn = sqlite3.connect(':memory:')
print('Default isolation_level:', repr(conn.isolation_level))
conn.isolation_level = None
print('Now autocommit:', conn.isolation_level)
conn.close()เหตุผลที่ธุรกรรมสำคัญ
หากไม่มีธุรกรรม การหยุดทำงานระหว่างการแก้ไขอาจทำให้ข้อมูลถูกเปลี่ยนแปลงไปเพียงครึ่งหนึ่ง ธุรกรรมทำให้ชุดการเปลี่ยนแปลงมีคุณสมบัติ เป็นหนึ่งเดียว กล่าวคือไม่สามารถแบ่งแยกได้ ซึ่งช่วยปกป้องความถูกต้องสมบูรณ์ของข้อมูล
import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE log (msg TEXT)')
with conn:
conn.execute('INSERT INTO log VALUES (?)', ('all or nothing',))
print('Atomic write done')
conn.close()ตรวจสอบความเข้าใจ
ทดสอบความรู้เกี่ยวกับธุรกรรมของคุณ
สรุปทบทวน
คุณได้เรียนรู้การจัดการธุรกรรมอย่างปลอดภัย
commit()บันทึกการเปลี่ยนแปลง ส่วนrollback()ยกเลิกการเปลี่ยนแปลง- ห่อการเขียนข้อมูลที่มีความเสี่ยงไว้ใน
try/exceptพร้อมการย้อนกลับ with conn:ยืนยันหรือย้อนกลับการเปลี่ยนแปลงโดยอัตโนมัติcontextlib.closingรับประกันว่าการเชื่อมต่อจะถูกปิด
คำถามที่พบบ่อย
บทเรียน “ธุรกรรมและตัวจัดการบริบท” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ธุรกรรมและตัวจัดการบริบท” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ธุรกรรมและตัวจัดการบริบท”
ยืนยันหรือย้อนกลับธุรกรรมอย่างปลอดภัย คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ธุรกรรมและตัวจัดการบริบท” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเชื่อมต่อและการสร้างตาราง
- Insert, Select, Update, Delete
- คำสั่งสอบถามแบบกำหนดพารามิเตอร์
- ธุรกรรมและตัวจัดการบริบท