oracle之事务(one)
oracle之事务(one)
一)事务处理过程
1、首先客户端要连接到服务器,服务器会分配相关进程来回应用户请求操作。
2、服务器开始接收用户的sql操作,那么首先检查share pool,查看是否有包含该sql语句的共享sql区,如果有,那么会检查用户对所要操作的对象是否有相关权限,如果有那么sql共享区会处理该sql语句。如果没有sql共享区,那么会分配一个新的sql共享区,以便分析和处理sql语句。如果用户对所要操作的对象没有权限,则会提示报错出现无权限提示。
3、锁定该sql语句所要操作的对象
4、服务器进程处理sga中的数据,如果数据没有在sga中,那么将从数据文件中读取到sga的buffer cache中进行处理。
5、在适当的时刻,lgwr进程会把redo log buffer 中的重做日志条目写入到联机日志中,同样,dbwr后台写入进程也会把相应的buffer cache 中的数据写入到数据文件中。
6、为该事物分配一个scn,该scn可以保证数据的一致性,用于并发控制和数据库的恢复。该scn会被记录到控制文件、数据文件头部、数据块头部以及重做日志中。
7、lgwr后台进程会把所有的剩余的、已经缓冲的重做日志和scn写入到联机日志中去(改过程可以理解为commit和rollback),一旦写入成功,那么这个事务就被记录完成了,这次事务的操作结果都被永久的记录下来了,如果后续突然发生故障,那么也可以应用该日志进行事务的操作变更恢复数据。
8、事务处理完成后,那么服务器会释放sql语句所占用的资源,并解除对操作对象的锁定操作。
9、当事务是(提交事务或是回滚事务)成功就会提示相关成功操作内容。否则提示错误
10、在适当的时刻,dbwr进程会把缓冲区中剩余的脏块全部写入到数据文件中。
二)事务控制语句及功能
1) 事务控制语句有:
commit; 提交事务
rollback;回滚事务
savepoint 设置部分事务的保存点
rollback savepoint ;回退到事务的保存点(事务还是没有完成)
set transaction;设置事务的属性
set constraints ;设置可以延迟约束的检查机制
2)事务的开始与结束
事务没有明确的开始,连接到了数据库并执行一条sql语句那么就开始了事务。
在发生如下情况的时候事务就结束了;
执行commit或rollback语句完后,那么事务就结束了,但rollback savepoint是回到一部分事务时刻这个时候事务还是没有结束的。
在执行dml语句失败的时候,事务就自动结束了。
在设置了一条会自动提交的语句的时候,事务就结束了
在一下情况事务会自动提交
在进行ddl操作的时候,事务会自动提交
设置 set autocommit on之后每次执行完dml语句,数据库都会自己提交事务。
当disconnect数据库后,事务会自动回滚rollback,事务也就结束了。
3)提交事务情况和回退全部事务情况
4)设置事务保存点,回退部分事务
测试如下:
[sql] SCOTT@orcl#select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 800 20 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7566 JONES MANAGER 7839 02-4月 -81 2975 20 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7788 SCOTT ANALYST 7566 19-4月 -87 4000 20 7839 KING PRESIDENT 17-11月-81 5000 10 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 7876 ADAMS CLERK 7788 23-5月 -87 1100 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- 7900 JAMES CLERK 7698 03-12月-81 950 30 7902 FORD ANALYST 7566 03-12月-81 3000 20 7000 MILLER CLERK 9000 23-1月 -82 2000 10 已选择14行。 SCOTT@orcl#update emp set mgr=2000 where empno=7000; 已更新 1 行。 SCOTT@orcl#select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 800 20 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7566 JONES MANAGER 7839 02-4月 -81 2975 20 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7788 SCOTT ANALYST 7566 19-4月 -87 4000 20 7839 KING PRESIDENT 17-11月-81 5000 10 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 7876 ADAMS CLERK 7788 23-5月 -87 1100 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- 7900 JAMES CLERK 7698 03-12月-81 950 30 7902 FORD AN
上一个:sql_trace导致数据库提示错误
下一个:ORA-01555原理分析
- 更多Oracle疑问解答:
- 运行exp备份oracle数据库提示oracle-12154错误
- 有没有,生产Oracle Rman 备份脚本的工具啊!
- 初学orcle,希望有大大帮忙解说一下详细步骤,从登录oracle到创建表的过程
- oracle语句问题:一张user表,三个字段,id,name,time,插入记录比如:张三2007,李四2008,张三2011
- 如何写一个ORACLE触发器同步两个表中的数据?
- oracle 如何查看一个服务器上有多少个数据库.
- oracle 创建包的时候错误 求解
- oracle 重复列的问题
- oracle 中如何查处2星期前的数据
- 请教oracle数据库安装中的问题
- 请问谁能提供给我标准的oracle ERP的数据库表结构并详细说明各表主要的作用?
- 安装oracle遇到的问题 invalid entry CRC (expected 0x3e12e795 but got 0x9db0e9fd)
- 我的是ORACLE 10G,在RMAN中如何按指定的时间恢复数据文件啊?
- oracle为什么没有自动增长列
- oracle快捷键都有哪些啊?