自己写:三类异常,一次分清

👁️ 0 人浏览 💬 0 人评论 ❤️ 添加收藏

把 TODO 补完,打出脏读读到的值脏读那个值后来变成了几幻读前后的个数(四段,用 / 隔开)。

acct 表:3 行,一开始每人 100,总额 300
id    1 / 2 / 3
name  甲 / 乙 / 丙
bal   100 / 100 / 100

四个现成的工具函数(题面里已经写好)
bank(ru_a, ru_b) → 铺一份新库,给你两个连到**同一份数据**的连接 a、b
bal(c, i)        → 某个账户的余额;读不到(被锁着)就返回"锁住"
total(c)         → 三个账户加起来多少钱;读不到就返回"锁住"
try_write(c, sql)→ 写一下:写得进去返回"成功",被锁住返回"写不进"
import sqlite3

_KEEP = []          # 保管连接:只要它活着,这份内存库就不会被回收
_SEQ = [0]

def bank(ru_a=False, ru_b=False):
    """铺一份新的三账户库,返回两个连到同一份数据的连接 (a, b)。
    ru_a / ru_b:把那一边放松成"可以读到别人还没提交的改动"。"""
    _SEQ[0] += 1
    uri = "file:bank" + str(_SEQ[0]) + "?mode=memory&cache=shared"
    keep = sqlite3.connect(uri, uri=True)
    _KEEP.append(keep)
    keep.execute("CREATE TABLE acct (id INTEGER PRIMARY KEY, name TEXT, bal INTEGER)")
    keep.executemany("INSERT INTO acct VALUES (?,?,?)",
                     [(1, "甲", 100), (2, "乙", 100), (3, "丙", 100)])
    keep.commit()
    a = sqlite3.connect(uri, uri=True)
    b = sqlite3.connect(uri, uri=True)
    if ru_a:
        a.execute("PRAGMA read_uncommitted = 1")
    if ru_b:
        b.execute("PRAGMA read_uncommitted = 1")
    return a, b

def bal(c, i):
    """某个账户的余额。读不到(表被别人锁着)就返回"锁住"。"""
    try:
        return c.execute("SELECT bal FROM acct WHERE id = ?", (i,)).fetchone()[0]
    except sqlite3.OperationalError:
        return "锁住"

def total(c):
    """三个账户加起来一共多少钱。读不到就返回"锁住"。"""
    try:
        return c.execute("SELECT SUM(bal) FROM acct").fetchone()[0]
    except sqlite3.OperationalError:
        return "锁住"

def try_write(c, sql):
    """让这个连接写一下,写得进去返回"成功",被锁住返回"写不进"。"""
    try:
        c.execute(sql)
        return "成功"
    except sqlite3.OperationalError:
        return "写不进"
# 第一段:脏读
a, b = bank(ru_b=True)
a.execute("UPDATE acct SET bal = bal - 30 WHERE id = 1")
p = bal(b, 1)
a.rollback()
q = bal(b, 1)
# 第二段:幻读
c, d = bank(ru_a=True)
c.execute("BEGIN")
# TODO:数一次、让 d 插一个 id 是 4 余额 100 的账户并提交、再数一次
# TODO:按 脏读值/后来的值/幻读前/幻读后 的顺序打出来
print("")
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论