怎样使用数据库事务处理

问题:

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

解决:

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

  1. import web
  2. db = web.database(dbn="postgres", db="webpy", user="foo", pw="")
  3. t = db.transaction()
  4. try:
  5. db.insert('person', name='foo')
  6. db.insert('person', name='bar')
  7. except:
  8. t.rollback()
  9. raise
  10. else:
  11. t.commit()

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

  1. from __future__ import with_statement
  2. db = web.databse(dbn="postgres", db="webpy", user="foo", pw="")
  3. with db.transaction():
  4. db.insert('person', name='foo')
  5. db.insert('person', name='bar')

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

  1. def post(title, body, tags):
  2. t = db.transaction()
  3. try:
  4. post_id = db.insert('post', title=title, body=body)
  5. add_tags(post_id, tags)
  6. except:
  7. t.rollback()
  8. else:
  9. t.commit()
  10. def add_tags(post_id, tags):
  11. t = db.transaction()
  12. try:
  13. for tag in tags:
  14. db.insert('tag', post_id=post_id, tag=tag)
  15. except:
  16. t.rollback()
  17. else:
  18. t.commit()

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