void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
sqlite3_commit_hook() 接口注册一个回调函数,该函数在事务被提交时调用。对于同一个数据库连接,任何之前通过 sqlite3_commit_hook() 设置的回调都会被覆盖。sqlite3_rollback_hook() 接口注册一个回调函数,该函数在事务被回滚时调用。对于同一个数据库连接,任何之前通过 sqlite3_rollback_hook() 设置的回调都会被覆盖。pArg 参数会传递给回调函数。如果提交钩子函数的回调返回非零值,则提交会被转换为回滚。
sqlite3_commit_hook(D,C,P) 和 sqlite3_rollback_hook(D,C,P) 函数返回在同一个数据库连接 D 上之前对相同函数的调用中传递的 P 参数,或者对于 D 上每个函数的第一次调用返回 NULL。
提交和回滚钩子回调不是可重入的。回调实现不能执行任何修改调用回调的数据库连接的操作。任何修改数据库连接的操作必须延迟到触发提交或回滚钩子的sqlite3_step()调用完成后再执行。请注意,运行任何其他 SQL 语句,包括 SELECT 语句,或者仅仅调用sqlite3_prepare_v2() 和sqlite3_step() 都会修改数据库连接,在本段中“修改”的含义即为此。
注册一个 NULL 函数会禁用回调。
当提交钩子回调例程返回零时,COMMIT 操作将正常继续。如果提交钩子返回非零值,则COMMIT 会转换为ROLLBACK。回滚钩子会在提交钩子返回非零值导致的回滚上被调用,就像其他任何回滚一样。
就本 API 而言,如果执行了显式的“ROLLBACK”语句,或者错误或约束导致隐式回滚发生,则认为事务已回滚。如果由于数据库连接关闭而自动回滚事务,则不会调用回滚回调。
另请参阅sqlite3_update_hook() 接口。