【DB.Oracle】事务transaction的隐式提交commit

本文解析了数据库中的隐式提交机制,介绍了其定义、触发方式及注意事项,并深入探讨了其本质和必要性。

隐式提交的定义


又名自动提交,即无需显示执行commit语句,session中的操作被自动提交到数据库的过程。

隐式提交的方式


  • 正常执行完ddl语句。包括create,alter,drop,truncate,rename。
  • 正常执行完dcl语句。包括grant,revoke。
  • 正常退出sql*plus,没有明确发出commit或者rollback。


隐式提交的注意事项


  • 执行ddl语句时,前面的dml操作也会被提交到数据库中

因为是在一个session里,那执行ddl语句的时候前面的dml语句肯定也会“不可幸免”的被提交到库中。


  • 即使ddl语句执行失败,前面的dml操作也会被提交到数据库中

这就有点儿让人奇怪了,ddl都执行失败了,怎么还会提交呢?这就需要探究一下隐式提交的本质了(下文有叙述)。


  • 在前面1和2的基础上总结

为了避免隐式提交或者回滚,尽量保证一条或者几条DML操作完成后有显示的提交或者回滚,防止后续执行的DCL或者DDL自动提交前期的DML操作。


隐式提交的本质


  • 一条ddl语句执行了两次commit
    commit;

    ddl statement;

    commit;


   第一个commit将当前session中未提交的事务隐式提交,以保证ddl语句失败时的回滚位置。

   第二个commit将ddl

  • 为什么需要隐式提交?

为了保证事务的一致性。我们在执行ddl语句的时候,oracle需要在它的系统表中进行元数据的记录操作(即:除了建表还会进行不少insert操作),如果它不隐式提交就无法保证一致性;从内部运行机制来看ddl语句和dml语句还是有很大区别的,dml会对每个语句的每条记录都做日志记录以便于回滚,而ddl往往没必要搞这么复杂,从功能和易用性上看隐式提交都是最好的选择。




### 事务Oracle 数据库中的使用案例 Oracle 数据库中的事务管理是保障数据一致性和并发控制的重要机制。事务是一组 SQL 操作,它们作为一个整体执行,要么全部成功,要么全部失败。事务的 ACID 属性(原子性、一致性、隔离性、持久性)确保了数据库在并发环境下的可靠性。 #### 1. 事务的基本操作 在 Oracle 中,事务通常以 `BEGIN` 开始(虽然在某些接口中可以开始),通过 `COMMIT` 提交事务,或者通过 `ROLLBACK` 回滚事务。以下是一个典型的事务处理流程,假设操作涉及 `employees` 表: ```sql -- 开始事务) UPDATE employees SET salary = salary + 1000 WHERE id = 101; UPDATE departments SET budget = budget - 1000 WHERE id = 20; -- 提交事务 COMMIT; ``` 如果在执行过程中发生错误,例如第二个 `UPDATE` 失败,则可以通过 `ROLLBACK` 撤销所有更改: ```sql -- 回滚事务 ROLLBACK; ``` 上述事务操作确保了数据一致性,即使在操作失败时也不会导致数据的不一致状态[^1]。 #### 2. 事务的隔离级别与并发控制 Oracle 支持多种事务隔离级别,包括读已提交(Read Committed)和可串行化(Serializable)。在实际应用中,可以通过设置隔离级别来控制事务的可见性和并发行为。例如,使用 `SET TRANSACTION` 命令设置事务的隔离级别: ```sql -- 设置事务为可串行化 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ``` 这种设置确保事务在执行期间看到的是一个一致性的数据快照,避免了脏读和不可重复读的问题。在高并发系统中,合理选择隔离级别可以提升系统性能,同时保障数据的正确性[^1]。 #### 3. 事务与 PL/SQL 编程 在 PL/SQL 中,事务控制可以与存储过程或函数结合使用。以下是一个使用 PL/SQL 块的事务处理示例: ```plsql BEGIN -- 更新员工薪资 UPDATE employees SET salary = salary + 500 WHERE id = 102; -- 更新部门预算 UPDATE departments SET budget = budget - 500 WHERE id = 20; -- 提交事务 COMMIT; EXCEPTION WHEN OTHERS THEN -- 出现异常时回滚 ROLLBACK; RAISE; END; ``` 该 PL/SQL 块实现了事务的原子性,确保在发生异常时不会留下部分更新的状态。这种结构在金融系统或库存管理系统中非常常见,能够有效防止数据不一致问题。 #### 4. 事务与分布数据库 在分布数据库环境中,Oracle 支持两阶段提交(Two-Phase Commit, 2PC)协议,确保多个数据库节点之间的事务一致性。例如,在跨数据库更新操作中,可以使用如下语句: ```sql -- 更新本地数据库 UPDATE local_table SET value = 100 WHERE id = 1; -- 更新远程数据库 UPDATE remote_table@remote_db SET value = 200 WHERE id = 1; -- 提交事务 COMMIT; ``` 在上述操作中,如果其中一个更新失败,整个事务将被回滚,确保分布系统中的数据一致性。这种机制广泛应用于跨地域、跨系统的金融交易处理中[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值