悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.
当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Lo
1、 undo表空间的数据是非常非常重要的,只有commit,rollback才会被释放掉.是不可以用手动清除的。
2、 undo表空间主要是存储没有commit或rollback的delete和update的sql语句;缩小程序代码中相关的事务,及时的提交或回滚可以减少undo表空间的消耗;
3、释放表空间的方法就是删除回滚表空间后再重新创建,对应的sql语句如下:
alter system set undo_tablespace = ‘’;
drop tablespace undotbs including contents and datafiles cascade constraints;
create undo tablespace undotbs datafile ‘/home/oracle/oradata/dmc/undotbs.dbf’ size 3000m;
alter system set undo_tablespace =‘undotbs’;
查看数据库系统的事务执行情况的sql语句为:
select * from V$transaction;
ORCLE回滚表空间总结
回滚表空间也成为undo表空间,undo表空间时用来存储数据库生成的undo信息,一旦你执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,这是就可以利用这些undo信息将数据放回到修改前的样子。也就是说,undo表空间具有取消一条语句或一组语句的作用。例如,假设我们的事务执行了一个insert语句,这条语句导致分配一个新区段。通过执行这个insert,我们将得到一个新的块,格式化这个块后在其中放上一些数据。此时,可能出现另外某个事务,它也向这个块中插入数据。如果要回滚我们的事务,显然不能取消对这个块的格式化和空间分配。因此,Oracle回滚时,它实际上会做与先前逻辑上相反的工作。对于每个insert,Oracle会完成一个Delete。对于每个delete,Oracle会执行一个insert。对于每一个update,Oracle则会执行一个“反update”,或者执行另一个update将修改前的行放回去。
什么操作会生成最多和最少的undo信息?
如何释放undo表空间?
分析常见的ORA-01555:snapshot too old 错误。
稳测试中验证:当undo表空间用完时,数据库是否能够正常提供服务。