Oracle 11g是一个关系型数据库管理系统,它提供了强大的事务管理功能,可以确保数据库操作的一致性、可靠性和持久性。事务是数据库中一组操作的逻辑单元,要么全部执行成功,要么全部不执行,不会出现部分执行的情况。
在Oracle 11g中,事务具有以下特点:
原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部不执行。如果事务中的任何一个操作失败,整个事务将被回滚到之前的状态,保持数据库的一致性。
一致性(Consistency):事务执行前后,数据库的完整性约束和业务规则都得到了保持,数据库从一个一致的状态转移到另一个一致的状态。
隔离性(Isolation):事务之间相互独立,互不干扰。即使多个事务同时对同一数据进行操作,也不会相互影响。
持久性(Durability):一旦事务提交,其结果将永久保存在数据库中,即使系统发生故障也不会丢失。
在Oracle 11g中,可以使用SQL语句来控制事务的提交和回滚,例如使用COMMIT语句提交事务,使用ROLLBACK语句回滚事务。此外,Oracle 11g还提供了事务管理的高级功能,如事务日志、事务恢复和并发控制,以确保数据库的安全性和可靠性。
总之,Oracle 11g的事务管理功能可以帮助用户确保数据库操作的一致性和可靠性,保护数据库的完整性和安全性。
在执行第一条DML SQL 语句时开始
在发生下列事件之一后结束:
1、发出COMMIT
或ROLLBACK
语句
2、执行DDL或者DCL语句(事务会自动提交),例如执行CREATE操作
3、用户退出当前SESSION
4、系统崩溃(比如说数据库服务器断电、硬件异常造成系统宕机等等)
一个事务处理结束之后,下一个可执行的SQL语句会自动启动下一个事务处理。
DDL与DCL语句是自动提交的,因此会隐式的结束一个事务的处理。
create table yggz(code int, salary number(7,2));
insert into yggz values(1, 1000);
insert into yggz values(2, 150);
commit;
完成任务:
如果1号员工的salary多于300元,则从1号员工的salary中减少300元,同时加到2号员工的salary上。
以下是一个简单的PL/SQL程序,用于实现题目中要求的任务:
DECLARE
v_salary1 number(7,2);
v_salary2 number(7,2);
BEGIN
-- 获取1号员工的salary
SELECT salary INTO v_salary1 FROM yggz WHERE code = 1 FOR UPDATE;
-- 判断1号员工的salary是否多于300元
IF v_salary1 > 300 THEN
-- 减少1号员工的salary
UPDATE yggz SET salary = salary - 300 WHERE code = 1;
-- 获取2号员工的salary
SELECT salary INTO v_salary2 FROM yggz WHERE code = 2 FOR UPDATE;
-- 增加2号员工的salary
UPDATE yggz SET salary = salary + 300 WHERE code = 2;
-- 提交事务
COMMIT;
DBMS_OUTPUT.PUT_LINE('任务完成');
ELSE
DBMS_OUTPUT.PUT_LINE('1号员工的salary不多于300元,无法完成任务');
END IF;
EXCEPTION
WHEN OTHERS THEN
-- 出现异常时回滚事务
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('任务失败');
END;
/
在上面的PL/SQL程序中,我们首先获取1号员工的salary,并判断是否多于300元。如果是,则减少1号员工的salary并增加2号员工的salary,然后提交事务。如果出现异常,则回滚事务。最后,根据任务的完成情况输出相应的信息。
create table yggz(code int, salary number(7,2));
insert into yggz values(1, 1000);
insert into yggz values(2, 150);
commit;
完成任务:
如果1号员工的salary多于300元,则从1号员工的salary中减少300元,同时加到2号员工的salary上,但是还要确保转账后的1号员工的salary多于转账后的2号员工的salary。
以下是一个简单的PL/SQL程序,用于实现题目中要求的任务:
DECLARE
v_salary1 number(7,2);
v_salary2 number(7,2);
BEGIN
-- 获取1号员工的salary
SELECT salary INTO v_salary1 FROM yggz WHERE code = 1 FOR UPDATE;
-- 获取2号员工的salary
SELECT salary INTO v_salary2 FROM yggz WHERE code = 2 FOR UPDATE;
-- 判断1号员工的salary是否多于300元,且转账后1号员工的salary多于转账后2号员工的salary
IF v_salary1 > 300 AND (v_salary1 - 300) > (v_salary2 + 300) THEN
-- 减少1号员工的salary
UPDATE yggz SET salary = salary - 300 WHERE code = 1;
-- 增加2号员工的salary
UPDATE yggz SET salary = salary + 300 WHERE code = 2;
-- 提交事务
COMMIT;
DBMS_OUTPUT.PUT_LINE('任务完成');
ELSE
DBMS_OUTPUT.PUT_LINE('1号员工的salary不多于300元,或者转账后1号员工的salary不多于转账后2号员工的salary,无法完成任务');
END IF;
EXCEPTION
WHEN OTHERS THEN
-- 出现异常时回滚事务
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('任务失败');
END;
/
在上面的PL/SQL程序中,我们首先获取1号员工和2号员工的salary,并判断1号员工的salary是否多于300元,且转账后1号员工的salary多于转账后2号员工的salary。如果条件满足,则执行转账操作,并提交事务。如果出现异常,则回滚事务。最后,根据任务的完成情况输出相应的信息。
这个PL/SQL程序实现了题目中要求的逻辑,可以在Oracle数据库中执行以完成任务。