视频教程
新版Oracle19C入门到熟练_哔哩哔哩_bilibili
学习要求
有一定关系型数据的操作功底,会SQL语句
教学目标
学习数据库中事务处理
概念
在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么完全成功执行,完成整个工作单元操作,要么一点也不执行。
事务的属性
-
原子性(Atomicity)-事务的原子性强调了一个事物是一个逻辑工作单元,是一个整体,是不可分割的。一个事务所包含的操作要么全部做,要不全部不做。
-
一致性(Consistency)-一个事务执行一项数据库操作,事务使数据库从一种一致性的状态变换成另一种一致性状态。
-
隔离性(Isolation)-在事务未提交前,它操作的数据,对其他用户不可见。
-
持久性(Durability)-一旦事务成功完成,该事务对数据库所施加的所有更新都是永久的。
事务的开始和结束
以第一个DML语句的执行作为开始
以下面的其中之一作为结束:
-
commit或rollback语句
-
DDL或DCL语句(自动提交)
-
用户会话正常结束--commit
-
系统异常终了--rollback
事务操作
COMMIT:事务提交命令
在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在Oracle 数据库中, 在事务提交前,只有操作数据库的用户才能有权看到所做的事情,别人只有在最后提交完成时才能看见。
ROLLBACK:事务回滚命令
-- 事务测试
-- 先查看表数据
select * from dept;
-- 执行DML开始事务
delete from dept where deptno = 60;
-- 查看删除效果
select * from dept;
-- 回滚事务
rollback;
-- 查看数据
select * from dept;
注意: 一旦执行commit 之后,数据就无法进行回滚了
-- 事务测试
-- 先查看表数据
select * from dept;
-- 执行DML开始事务
delete from dept where deptno = 60;
-- 查看删除效果
select * from dept;
-- 提交事务
commit;
-- 查看数据
select * from dept;
-- 回滚事务
rollback;
-- 查看数据
select * from dept;
SAVEPOINT
事务保留点,有点类似分段存档。
使用 SAVEPOINT 语句在当前事务中创建保存点。
使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。
-- 查看数据
select * from dept;
-- delete
delete from dept where deptno = 61;
-- 保留点A
savepoint A;
update dept set loc = 'BEIJIN' where deptno = 60;
insert into dept(deptno, dname, loc) values(63, 'BOSS', 'DONGGUAN');
-- 保留点B
savepoint B;
-- delete
delete from dept where deptno = 63;
-- 分别执行回滚
rollback to savepoint B;
rollback to savepoint A;
rollback;
事务的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommited(读未提交的) | Y | Y | Y |
Read commited(读提交的) | N | Y | Y |
Repeatable read | N | N | Y |
Serializable | N | N | N |
Oracle支持的隔离级别:
事务隔离级别 | 影响 |
---|---|
Read commited | Oracle默认的隔离等级,对一条SQL,可以保证数据的一致性,对于一个事务,无法做到repeatable read。 |
Serializable | 只能看到事务开始时所有提交的改变以及自身的改变 |
Read-only | 只能看到事务开始时所有提交的改变,自身不允许DML操作 |
orcale默认是Read commited 级别,可以下面语句对隔离级别进行修改
Set transaction isolation level read committed
-- 隔离级别验证
select * from dept;
delete from dept where deptno = 60;
-- 新开一个命令窗口,查看60数据
select * from dept;
--- commit之后再观察
commit;