如何在oracle SQL中使用事务?

时间:2016-02-03 13:45:52

标签: sql oracle transactions

我正在尝试在带有Oracle DB的SQL控制台上使用事务块。我曾经在PostgreSQL中使用过转移块,如

BEGIN;
<simple sql statement>
END;

但是在oracle中,似乎这是不可能的。我总是得到&#34; ORA-00900&#34;错误,我不知道如何解决这个问题。如果我只使用像

这样的SQL语句
<simple sql statement>
COMMIT;

它有效。但是,是否有一些标签来定义交易的开始?我试过了

START TRANSACTION;
<simple sql statement>
COMMIT;

但它仍然会抛出一个ORA-00900。我的操作系统是windows,我使用的是IntelliJ IDEA和Oracle 11g DB。

2 个答案:

答案 0 :(得分:6)

您可以通过发出一个SQL语句(

)来拥有隐式事务块
<simple sql statement>
Commit;

对于匿名块或PL / SQL过程/函数/包,您可以在Postgres中看到更多选项。

如果您有多个声明必须全部成功或全部失败(atomic transaction,那么,从the documentation,您可以:

DECLARE
   <variable declaration>
BEGIN
   <simple sql statement>
   <simple sql statement>
   <simple sql statement>
   SAVEPOINT do_insert;
   <sql insert statement>
EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN
      ROLLBACK TO do_insert;
      DBMS_OUTPUT.PUT_LINE('Insert has been rolled back');
END;
--and commit outside the transaction

答案 1 :(得分:0)

正常,读取已提交的事务,将自动启动第一个修改的行。

如果要明确设置事务,请使用:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED - 但是当第一行被修改时,事务将被物理创建,而不是在执行此语句时。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE - 在这种情况下,读取一致性将从执行此命令开始。 READ ONLY事务具有相同的读取一致性效果。