Wt3.2.3文档翻译:Wt::Dbo::Transaction类参考,Wt::Dbo::Transaction Class Reference
一个数据库事务。
这个类实现了一个资源获取及初始化(RAII)的事务。大部分的数据库对象 (dbo)操作都要求有一个事务处理活跃状态,并且对数据库的变更只有在活跃事务被提交时才会真正被提交到数据库中 。一个事务可使用 commit() 来提交 ,不过呢 ,在它被删除而又没有抛出异常 (使用std::uncaught_exception())的情况下也会自动提交。这就意味着 ,可能会出现这样的情况 :该事务需要被提交 ,而提交又失败了,于是事务的析构函数抛出一个异常。如果此事务是由于某处抛出了异常引起了栈展开(stack unwinding )而被删除的话,则此事务会回滚。
一个事务在提交或回滚之前是处于活跃状态的。当一个事务被回滚或是失败了时 ,那些被修改过的数据库对象就处于未成功同步到数据库的状态 。回滚并不会影响到内存中的数据库对象的值 ,因此可以稍后在一个新的事务中同步它们 ,或是通过 Session::rereadAll() 来丢弃它们。
妳应当尽妳所能来保护那些通过栈上的事务对象来改变数据库的函数不被打断。
但是妳可以同时创建多个(嵌套的)事务对象:通过这种方式 ,妳可以使用一个事务对象来保护一个函数 ,即使这个函数是被另一个定义了一个更大尺度的事务的函数调用的也没问题 。嵌套事务之间是保持一致的 (act in concert),并且它们引用了同一个逻辑事务 :如果有至少一个事务失败的话 ,整个逻辑事务就会失败,而只有当所有事务都成功提交时逻辑事务才会成功提交。
使用示例:
void doSomething(Wt::Dbo::Session& session)
{
Wt::Dbo::Transaction transaction(session);
Wt::Dbo::ptr<Account> a = session.load<Account>(42);
...
// 如果抛出了异常,则事务会回滚,否则就会提交
}
李丽珍
HxLauncher: Launch Android applications by voice commands