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