plsql事务处理(二)

自治事务

看看在oracle中一个事务调用另外一个事务的情况:

事务A

Begin

    DML;

    事务B

End;

事务B

Begin

    Commit;

End;

事务A对事务B中的操作可见,如果在事务Bcommit,会将事务A中的DMLcommit掉,自治事务就是来解决这样的问题的,使得事务B中的提交或回滚对A不可见。

使用一个例子来对比一下自治事务和普通的事务的不同:

SQL> create or replace procedure pro_test_tran is

 2 begin

 3  commit;

 4 end;

 5 /

 

Procedure created

 

使用pragma autonomous_transaction;来标识使用自治事务

SQL>

SQL> create or replace procedure pro_test_auto is

 2   pragma autonomous_transaction;

 3 begin

 4   commit;

 5 end;

 6 /

 

Procedure created

 

SQL> select a.sal from scott.emp a where a.empno = 7369;

 

        SAL

------------

     812.60

 

SQL> begin

  2   update scott.emp a set a.sal = a.sal + .01 where a.empno = 7369;

 3   pro_test_auto;

 4   rollback;

 5 end;

 6 /

 

PL/SQL procedure successfully completed

 

调用了pro_test_auto以后并没有将父事务中的dml提交掉:

SQL> select a.sal from scott.emp a where a.empno = 7369;

 

        SAL

------------

     812.60

 

SQL>

 

SQL> begin

 2   update scott.emp a set a.sal = a.sal + .01 where a.empno = 7369;

 3   pro_test_tran;

 4   rollback;

 5 end;

 6 /

 

PL/SQL procedure successfully completed

 

调用了pro_test_ tran将父事务中的dml提交掉了:

 

SQL> select a.sal from scott.emp a where a.empno = 7369;

 

        SAL

------------

     812.61

<think>嗯,用户想知道如何在PL/SQL中启动事务。首先,我需要回顾一下PL/SQL事务管理机制。在PL/SQL中,事务通常是由数据库隐式管理的,也就是说,当执行DML语句(如INSERT、UPDATE、DELETE)时,事务会自动开始。但用户可能需要显式控制事务的边界,比如使用COMMIT或ROLLBACK。 接下来,用户可能不太清楚显式启动事务的具体方法。需要明确的是,PL/SQL中没有显式的“START TRANSACTION”命令,这点和某些其他SQL环境不同。事务的开始是由第一个DML语句隐式触发的。不过,用户可以通过设置保存点(SAVEPOINT)或使用SET TRANSACTION语句来配置事务属性,比如隔离级别。 然后,需要考虑示例代码。用户可能需要一个具体的例子来说明如何组合使用这些命令。例如,在PL/SQL块中,先执行SET TRANSACTION设置隔离级别,然后执行DML操作,最后用COMMIT提交。这可以展示事务的显式控制过程。 另外,引用资料中提到PL/SQL处理零长度字符串时与数据库的行为差异,这可能影响事务中的数据操作,但当前问题主要关注事务启动,所以暂时可以不深入这部分,但需要确保示例代码的准确性。 用户可能还会有其他相关问题,比如事务的隔离级别、保存点的使用、异常处理中的回滚等。需要预见到这些问题,并在相关问题部分列出,帮助用户进一步探索。 最后,确保回答符合格式要求:使用中文,行内公式用$...$,代码块正确,引用标识正确添加。同时检查是否有误,比如PL/SQL事务是否真的没有显式开始命令,确认SET TRANSACTION的正确用法,避免提供错误信息。</think>### 如何在PL/SQL中启动事务 在PL/SQL中,事务(Transaction)的启动和执行遵循以下规则: 1. **隐式事务开始** PL/SQL事务的启动是隐式的。当执行第一条SQL语句(如`INSERT`、`UPDATE`、`DELETE`或`SELECT ... FOR UPDATE`)时,事务会自动开始。例如: ```sql BEGIN UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10; -- 事务从这里开始 END; ``` 2. **显式事务控制** 虽然事务的启动是隐式的,但可以通过以下语句显式控制事务: - `COMMIT`:提交事务,永久保存更改。 - `ROLLBACK`:回滚事务,撤销所有未提交的更改。 - `SAVEPOINT`:设置保存点,允许部分回滚。 3. **使用`SET TRANSACTION`配置事务属性** 可以通过`SET TRANSACTION`语句配置事务的隔离级别或访问模式,例如: ```sql BEGIN SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置事务隔离级别 INSERT INTO orders (order_id, customer_id) VALUES (1001, 101); COMMIT; -- 显式提交事务 END; ``` 4. **事务与异常处理** 在PL/SQL块中,如果发生未处理的异常,事务会自动回滚: ```sql DECLARE custom_exception EXCEPTION; BEGIN INSERT INTO log_table (message) VALUES ('Starting process'); RAISE custom_exception; -- 触发异常 EXCEPTION WHEN custom_exception THEN ROLLBACK; -- 显式回滚(非必须,但建议明确控制) END; ``` ### 关键注意事项 - PL/SQL事务行为与数据库的SQL引擎完全一致[^1]。 - 空字符串处理可能与事务无关,但需注意PL/SQL对零长度字符串的特殊处理(例如插入空字符串可能存储为`NULL`)[^2]。 ```sql -- 完整示例:显式控制事务的PL/SQLBEGIN SET TRANSACTION READ WRITE; SAVEPOINT start_point; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT; -- 提交事务 EXCEPTION WHEN OTHERS THEN ROLLBACK TO start_point; -- 回滚到保存点 RAISE; END; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值