0Pricing
Python Academy · บทเรียน

ธุรกรรมและตัวจัดการบริบท

ยืนยันหรือย้อนกลับธุรกรรมอย่างปลอดภัย

ธุรกรรมและตัวจัดการบริบท เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเชื่อมต่อและการสร้างตาราง
  2. Insert, Select, Update, Delete
  3. คำสั่งสอบถามแบบกำหนดพารามิเตอร์
  4. ธุรกรรมและตัวจัดการบริบท
← กลับไปที่ Python Academy