home > 怎样使用数据库事务处理

怎样使用数据库事务处理

问题:

怎样使用数据库事务处理?

解决:

数据库对象有一个方法“transaction”,将启动一个新的事务,并返回事务对象。这个事务对象可以使用commit提交事务或rollback来回滚事务。

import web

db = web.database(dbn="postgres", db="webpy", user="foo", pw="")
t = db.transaction()
try:
    db.insert('person', name='foo')
    db.insert('person', name='bar')
except:
    t.rollback()
    raise
else:
    t.commit()

在python 2.5+以上的版本,事务同样可以在段中使用:

from __future__ import with_statement

db = web.databse(dbn="postgres", db="webpy", user="foo", pw="")

with db.transaction():
    db.insert('person', name='foo')
    db.insert('person', name='bar')

它同样可能有一个嵌套的事务:

def post(title, body, tags):
    t = db.transaction()
    try:
        post_id = db.insert('post', title=title, body=body)
        add_tags(post_id, tags)
    except:
        t.rollback()
    else:
        t.commit()

def add_tags(post_id, tags):
    t = db.transaction()
    try:
        for tag in tags:
            db.insert('tag', post_id=post_id, tag=tag)
    except:
        t.rollback()
    else:
        t.commit()

嵌套的事务在sqlite中将被忽略,因为此特性不被sqlite支持。