Oracle事务和锁

复制代码
--什么是事务
  事务就是一组包含一条或多条语句的逻辑单元,每个事务都是一个原子单位。
在事务中的语句被作为一个整体,要么一起提交,作用在数据库上,使数据库数据
永久的修改;要么一起撤销,对数据库不做任何修改。

--事务控制语句
set transaction :设置事务的属性。
commit :提交事务。
savepoint :设置事务保存点。
rollback :回滚事务。
rollback to savepoint :回滚至保存点。

--设置事务是否自动提交,用来控制DML语句
set autocommit on/off;

--DDL语句是自动提交事务的。

--事务的特性
1、原子性:事务对数据的修改要么完全执行,要么完全不执行。
2、一致性:事务在执行前后数据库都必须处于一致性。也就是只要事务提交成功后,其他用户才可以看到修改后的数据。
3、分离性:分离性是指并发事务之间不能互相的干扰。一个事务操作的数据不会被其他事务看到和操作。
4、持久性:事务一旦提交完成,数据就已经永修被修改。


--锁的介绍
锁可以防止事务之间的破坏行交互。约束了最大程度的并发性。数据的完整型。


--锁的分类
1、排他锁(X锁)。防止资源共享,也就是当一个事务正在操作的数据时,其他事务不可以操作这个事务的数据。
2、共享锁(S锁)。被锁主的数据只能被读取,不能被修改。也不可以添加X锁。但可以添加S锁。
--锁的类型
DML锁:也叫数据锁,用于保护数据。
DDL锁:可以保护模式中对象的结构。
内部闩锁:保护数据库的内部结构,完全自动调用。

行级锁(TX锁),也叫事务锁。防止记录同时被两个事务修改。
表级锁(TM锁),防止在修改表数据时,表的结构发生变化。


--DDL锁
Exclusive DDL lock :排他DDL锁定,如果对象被添加了此锁,就被能被其他会话修改,也不能在增加其他DDL锁。如果是表,此时表数据只可以读取。
Shared DDL lock :共享DDL锁定,保护对象的结构,其他会话不能修改该对象的结构,但可以修改数据。
Breakable Parsed Lock : 此类锁可以被打断,不能禁止DDL操作。

--锁等待和死锁
锁等待也叫锁冲突。锁等待会严重地影响数据库性能和日常工作。
死锁,死锁也就是,锁等待的一种,但死锁会让事务一直处于锁等待的状态。


--解决死锁的情况
1、登录OEM管理器。
2、进如实例锁界面。
3、查找到阻塞锁,就终止掉次锁,也可以使用Kill 关键字杀死次会话。

--查看是否有死锁
select username, lockwait, status, machine, program
  from v$session
 where sid in (select session_id from v$locked_object);

--如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。

--用dba用户执行以下语句,可以查看到被死锁的语句
select sql_text
  from v$sql
 where hash_value in
       (select sql_hash_value
          from v$session
         where sid in (select session_id from v$locked_object))

--杀死死锁
alter system kill session 'sid';
--(其中sid=l.session_id)

--如果还不能解决: 
select pro.spid
  from v$session ses, v$process pro
 where ses.sid = XX
   and ses.paddr = pro.addr;

--其中sid用死锁的sid替换: 
exit
   ps -ef | grep spid ;

--其中spid是这个进程的进程号,kill掉这个Oracle进程。
复制代码

 

posted on   拿着菜刀  阅读(442)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示