事务与锁

2015/02/01 Oracle

事务与锁

事务的特性

事务必须具备以下四个属性,简称ACID属性:
原子性:事务是一个完整的操作,事务的各部操作是不可分的,要么全部执行,要么全部都不执行
一致性:一个查询的结果必须与数据库在查询开始的状态一致
场景:查询数据,9:00开始查询数据,9:15查询完毕,在这期间所查询的数据被其他操作更新,且9:00-9:15之间查询结果显示的是9:00时候并没有更改的数据,一般oracle是把这个没有更新的数据放入undo里,如果oracle在undo里没有找到数据则宁可报错,也不会让你看到其他操作更新的新的数据。
隔离性:对于其他会话来说,未完成的(也就是未提交的)事务不可见,事务之间相互不影响
持久性:事务一点提交成功后,数据就不可以丢失这个事务的结果,数据库通过日志能够保持事务的持久性。
场景:事务提交之后不可逆,提交数据是由内存的数据刷新到磁盘上,这个过程的快慢和性能有关,那么oracle主要是靠rudo日志,先写日志,在写到磁盘上。

事务的开始与结束

事务采用隐性的方式,起始于session的第一条DML语句,
查看事务:select * from v$transaction;
事务结束于:
1. COMMIT或者ROLLBACK
2. DDL语句被执行
3. DCL语句被执行
4. 用户退出SQLPLUS(正常退出是提交,非正常退出是回滚)
5. 机器故障或系统崩溃(回滚)
6. shutdowm immediate(回滚)

锁大概分为:共享和排他锁
排他锁(独占),排斥其他排他锁和共享锁。
共享锁,排斥其他排他锁,但不排斥其他共享锁。
锁类型:
DML锁(data locks ,数据锁),用于保护数据的完整性。TX行级锁,TM表级锁,我们日常所使用的DML操作就会产生事务和锁。
查看锁:select * from v$lock;
DDL锁(dictionary locks,数据字典锁),用于保护数据库对象的结构,如表,索引等结构定义。
SYSTEM锁(internal locks and latches),保护数据库的内部结构
锁用途:只要有事务就会产生锁,保证数据的完整性和正确性

加锁模式

自动加锁,做DML操作时,如insert,update,delete,以及select..for update由oracle自动完成加锁。

select*from emp where deptno=10 for update;

修改其部门为10的记录则会被锁定,我们可以进行试探要修改数据记录是否被加锁。如下三种形式均可:

select * from emp where empno=111 for update nowait
select * from emp where empno=111 for update wait 5
select * from emp where empno=111 for update skip locked

如果这个锁占用的时间太长,我们可以通过管理员杀掉session用户

首先找到是哪个sid占用太长时间,查看v$lock表
然后根据v$lock表的sid,去v$sesion里面去找到,进行kill操作。
select sid,serial# from v$sesion where sid=170;
alter system kill session 'sid,serial';

死锁问题

oracle会自动解决死锁问题。

Search

    Table of Contents