首页 > Linux操作系统 > Linux操作系统 > oracle 事务处理
数据库事务处理:
事务开始: 当第一个DML语句一个事务开始(数据操纵语言:insert、delete、select、update
增、删、查、改)
事务结束: 当一个commit和rollback语句被发布
当一个DDL语句执行,(数据定义语言 create、alter、drop、truncate)
当一个DCL语句执行,(数据控制语言 grant、revoke(授权、回收)、set role)
用户退出
机器失效或者崩溃
当一个事务结束后,下一个可执行的SQL语句自动开始下一个事务,
一个DDL语句或者一个DCL语句自动提交,并且因此一个事务隐式结束
commit和rollback语句的优点:
确保数据的一致性
在数据永久改变之前进行预览
分组逻辑相关的操作
控制事务:
commit 结束当前事务,使得所有未决的数据永久改变
savepoint name 在当前事务中标记保存点
rollback 结束当前事务,丢弃所有未决的数据改变
rollback to savepoint name 回滚当前事务到指定的保存点,从而丢弃保存点创建后的
任何改变.如果忽略 to savepoint子句,rollback语句回
滚整个事务.由于保存点是逻辑的,因此,没有办法列出已
经创建的保存点
可以用savepoint语句在当前事务中创建一个标记
用rollback to savepoint 语句回退到哪个标记
例如:
update .........
savepoint update_done;
insert..........
rollback to update_done;
回退到保存点,可以用savepoint语句创建一个标记,它把事务分为较小的部分
rollback to savepoint语句丢弃未决的改变到该标记.如果你用与前面的保存点相同的
名字创建了另一个保存点,哪个早一点时间创建的保存点就被删除了.
select * from testtable t;
update testtable set content ='11pp1' where id = 1;
commit;
savepoint kk;
insert into testtable values(12,'kingking',sysdate);
rollback to kk;
commit;
隐式事务处理
在正常的情况下,一个自动提交发生:
----DDL语句被发送
----DCL语句被发送
----正常退出,没有明确地发送commit或rollback语句
在正常的情况下,一个自动回滚发生:
----系统发生异常,或者非正常退出
commit或rollback之前的数据状态
事务中所在的每一个数据改变在事务被提交之前都是临时的,
在commit或rollback语句发布之前数据的状态:
1.数据操纵操作首先影响数据库缓冲区,因此,数据以前的状态可以被恢复.
2.当前用户可以查询表观察到数据操纵操作的结果.
3.其他用户不能观察到当前所做的数据操纵操作的结果.oracle服务器用读一致性
来确定每个用户看到的数据和上次提交时相同.
4.其他用户不能改变受影响的行中的数据.
在commit之后数据的状态
数据在数据库中被永久地改变.
数据以前的状态永久地丢失.
所有用户都可以观察到事务的结果.
受影响的行的锁定被释放:其他用户可以操纵那么行.
所有保存点给擦除.
rollback后的数据状态
数据的改变被撤消.
数据的以前的状态被恢复.
受影响行的锁定被释放.
语句级rollback
如果一个语句的执行错误被发现,一个事务的一部分可以用隐式的回退丢弃.如果一个单
个的DML语句在一个事务的执行期间失败,它的影响被一个语句级的回退撤消, 但在事务
中的以前已经由DML语句完成的改变不能丢弃,它们可以由用户显示地提交或回滚.
oracle在任何DDL(create,建表)语句之前和之后发布一个隐式的提交.所以即使你的DDL
语句执行不成功,你也不能回退前面的语句,因此服务器已经发布提交命令.
执行commit或rollback语句来明确地结束事务.
oracle服务器在数据上实现锁以防止对数据库中数据的并发操作, 当一个DML语句成功执
行时,数据库上的隐式锁被获得,默认情况下,oracle服务器在尽可能的最低级别锁定数据
执行带for update子句的lock table语句或select语句可以手动获得数据库上的锁.
读一致性
数据库用户用两种方法访问数据库:
读操作(select 语句)
写操作(插入,更新,删除语句)
你需要读一致性,所以有下面事发生:
数据库读者和写者被确保对数据观察的一致性.
读者不能观察正在变化过程中的数据.
写者被确保对数据库的改变以一致的方式进行.
一个写者所做的改变不破坏另一个写者所做的改变或与其冲突.
读一致性的目的是确保每个用户看到的数据和他最后一次提交,并且在一个DML操作操作开始之前的数据一样.
读一致性是一种自动的执行,该操作在回退段保持一个数据库的局部的拷贝.对数据库进行
一个插入,更新或者删除时,oracle服务器在数据改变之前获得相关数据的拷贝,并且将这
些数据写到一个回退段(undo segment).
所有读数据者,除了发布修改命令的用户,看到的数据还是改变之前的状态;他们看到数据
是回退段数据快照.在改变被提交到数据库之前,只有正在修改数的用户能看见数据库的改
变:除了他之外的任何人看到都是回退段的快照,这样就确保数据的读者读到一致的数据,
而不是当前正在被修改的数据.
当一个DML语句被提交的时,对数据库所做的改变对任何执行select语句的人成为可见的.
在回退段的文件中被旧数据占用的空间被释放以重新使用.
锁定:
锁是防止访问相同资源的事务之间的破坏性交互机制.即可以是用户对象(如表或行),也可
以是对用户不可见的系统对象(例如共享数据结构和数据字典).
oracle数据库怎么锁定数据
oracle锁被自动执行,并且不要求用户干预.对于SQL语句隐式锁是必须的,依赖被请求的
动作.隐式锁定除了select外,对所有的SQL都发生.
用户也可以手动锁定数据,这叫显示锁定.
隐式锁定:
2种锁的模式:
独占锁:不允许其他用户访问
共享锁:允许其他用户访问
高级数据并发操作:
DML:表共享,行独占
查询:不需要锁
DDL:保护对象定义
当执行数据操纵语言(DML,insert)操作时,oracle服务器通过DML所防止数据被同时操纵.
共享锁是在表级在DML操作期间自动获得的.用这个模式,几个事务可以在相同的资源上获得共享锁.
对于用DML语句修改的每一行,独占锁被自动获得.独占锁在本事务被提交或回滚之前防止行被其他事物修改.该锁确保无其他用户能够在相同的时间修改相同的行,并且覆盖另一
个还没有提交的改变.
当你修改数据库对象时,DDL锁发生.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7600171/viewspace-466068/ ,如需转载,请注明出处,否则将追究法律责任。