db.commit() 是为了让您不必多次编辑数据库吗?

Is the db.commit() so that you don't edit the database many times just once?

考虑这个table

db.define_table( 'people' , Field( 'name' ) )

我的理解是我可以像这样更新数据库中的记录:

选项 1:

for row in db( db.people ).select():
    row.update_record( name='Bob' )

选项 2:

for row in db( db.people ).select( id ):
    db( db.people.id == row.id ).update( name='Bob' )
db.commit()

有什么区别? .commit() 命令是否基本上一次完成所有更改,从而在更新期间阻止数据库访问?虽然 选项 1 一次更新每条记录,因此在两者之间的时间里,可以想象数据库是在 update_record 命令之间写入的?

我(可能不正确)的理解是,如果将上述代码(选项 2)放在模块而不是控制器中,则需要 db.commit(),因此需要 db.commit() 命令。

web2py 将每个 HTTP 请求包装在一个数据库事务中。如果请求过程中出现异常,事务将被回滚。否则,在请求结束时,就在返回响应之前,提交事务(因此所有 insert/update 操作都将在那时提交)。

如果您在应用程序代码中显式调用 db.commit(),那么事务将立即提交,而不是等到请求结束。任何后续操作都将成为新事务的一部分。

在上述两种情况下,所有更新都将同时提交。唯一的区别是,在第一种情况下,提交将在返回 HTTP 响应之前由框架发出(假设没有触发回滚的干预异常),而在第二种情况下,提交会在 [= 之后立即发生30=] 通过更新循环。

在选项 2 中,如果您将 db.commit() 调用移动到循环内,那么更新确实会一次提交一个而不是一次全部提交。

此外,请注意,要更新记录,您不需要先 select 它,如果要对多条记录应用相同的更新,则不需要更新一条记录一次,而是将更新应用于表示所有记录的 DAL Set 对象:

db(db.people.id > 0).update(name='Bob')

上面定义了 db.people table 中的一组记录(在本例中是所有记录),然后更新所有这些记录的 "name" 字段。此操作不涉及从数据库中 select 编辑的任何记录。