如何正确使用Commit语句?我是否必须为每个insert语句和每个函数使用commit语句?例如,如果我更改表以添加列,我是否必须使用commit语句?
答案 0 :(得分:1)
更改表格中的数据(插入,更新和删除)时需要提交。只要您不提交,其他用户就不会看到更改的数据,您仍然可以通过执行回滚来撤消更改。
每个语句后都没有必要提交。
更改表本身(alter table)时不需要提交。实际上,alter table语句发出了一个隐式提交。
答案 1 :(得分:1)
如果你运行DDL statement(CREATE
,ALTER
,DROP
,GRANT
等),那么:
Oracle数据库在每个DDL语句之前和之后隐式提交当前事务。
如果您运行DML语句(INSERT
,UPDATE
,DELETE
,SELECT
,CALL
,MERGE
),那么:
这些语句不会隐式提交当前事务。
并且您需要手动提交未提交的事务(但在每个语句后都不必COMMIT
)。
如果要执行部分回滚,则可以使用SAVEPOINT
s。
您不应将COMMIT
语句放在函数或过程中,以便您可以在单个事务中使用多个函数/过程,然后COMMIT
或ROLLBACK
整个事务。
答案 2 :(得分:0)
基于积累的经验和"良好实践" - 你不应该实施" commit"你的函数/程序中的语句(大多数时候,取决于任务,你试图实现什么)。 "提交"决定应该由用户调用你的函数/程序。 当发生/捕获异常时,您可以实现的是" rollback"。 通常,当从应用程序/ Web部件调用存储过程或函数时,它们是自动提交的(可以在事务方法中更改选项,据我所知,至少在java中)。
答案 3 :(得分:-1)
尝试:
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (Exception $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
}