三种现象:
- 胀读取:一个事物读取了被其他事物写入但未提交的数据
- 不可重复读取:一个事物再次读取曾经读取过,发现数据已经被其他已经提交的事物修改或者删除
- 不存在读取:事物按照之前查询条件重新查询,返回的结果集中包含其他已提交事务插入满足条件的新数据
SQL92标准的隔离级别
- 未提交读取
- 已提交读取
- 不可重复读取
- 串行化
|
Oracle支持事务隔离级别
已提交读取:
串行化:串行化隔离的事务只能看到事务执行前就已经提交数据,以及事务内Insert、Update、及delete语句对数据的修改。串行化隔离的事务不会出现不可重复读取或不存在的读取的现象
只读模式:只读事务只能看到事务执行前就已经提交的数据,且事务中不能执行Insert、Update及Delete语句
set transaction isolation level read commited
set transaction isolation level serializable
set transaction read only
脏数据就是读到database buffer cache做了修改但还没有写到datafile里面的数据,只要没有写入数据文件,不管是否提交,都可以称为脏数据。
锁:是防止访问相同资源的事务产生破坏性交互的机制
锁模式:
排他锁:能够阻止共享被加锁的资源。对数据进行修改时必须获得此种模式的锁。第一个排他地对资源加锁的事务是唯一可以对此资源进行修改的事务,直至排他锁被释放
共享锁:依据操作类型有条件地允许共享被加锁的资源。对数据进行读取的多个用户可共享此数据,这些用户可以对资源加以共享锁,防止其他用户并发地修改此资源。多个事务可以对相同的资源加共享锁
| |
锁 | 描述 |
| |
DML 锁(数据锁) | DML 的作用是保护数据。例如,表级锁(table lock)对整个表加锁,行级锁(row lock)则对选定的数据行加锁。 |
DDL 锁(数据字典锁) | DDL 锁的作用是保护方案对象的结构。例如,表及视图的定义。 |
内部锁(internal lock)及闩锁(latch) | 内部锁及闩锁用于保护数据库的内部结构,例如,数据文件。内部锁及闩锁的管理完全由 Oracle 自动完成。 |
行共享表级锁(row share table lock RS):表明拥有此锁的事务已锁定了表内的某些数据行,并有意对数据进行更新操作
SELECT....FROM table ....FOR UPDATE OF ......
LOCK TABLE table IN ROW SHARE MODE
允许操作:某个事务拥有了某个表的行共享表级锁后,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁的操作。也就是说,其他事务同时也能获得相同表上的行共享锁,行排他共享,及共享行排他模式的表级锁。
禁止操作:某个事务拥有了某个表的行共享表级锁后,只会禁止其他事务通过以下语句排他对相同表进行写操作。LOCK TABLE table IN EXCLUSIVE MODE;
行排他表级锁(row exclusive table lock RX):通常表面拥有此锁 的事务已经对表内的某些数据进行了更新操作。
INSERT INTO table.....
UPDATE table.....
DELETE FROM table.....
LOCK TABLE table IN ROW EXCLUSIVE MODE;
允许操作:某个事务拥有了某个表的行排他表级锁后,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁操作。即行排他表级锁允许其他多个事务同时获得相同表上的行共享表级锁或行排他表级锁
禁止操作:某个事务拥有了某个表的行排他表级锁后,将禁止其他事务手工地对表加锁进行排他地读写操作,因此其他语句不能对相同表加锁
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHAE EXCLUSIVE MODE
LOCK TABLE table IN EXCLUSIVE MODE;
共享锁(share table lock S):LOCK TABE table IN SHAE MODE
允许操作:某个事务拥有了某个表的共享表级锁后,其他事务可以查询表,可以使用select ......for update 语句锁定选中的数据行,也能够成功执行LOCK TABLE .......IN SHARE MODE 语句。但其他事务不能对表进行更新操作。多个事务可以并发地获得同一个表上的共享表级锁,在此种情况下任何事务都不能对表进行更新。因此,拥有共享表级锁的事务只能在此表上没有其他事务的共享表级锁时,才能对表进行更新操作
禁止操作:某个事务拥有了某个表的共享级锁后,将禁止其他事务修改此表,同时禁止其他事务执行以下语句
LOCK TABLE table IN ROW EXCLUSIVE MODE
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
共享行排他表级锁(share row exclusive table lock SRX):LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
允许操作:同一时间只有一个事务 能够获得表的共享行排他表级锁,某个事务拥有了某个表的共享行排他表级锁后,其他事务可以查询表,可以使用select ....for update 语句锁定选中的数据行,当不能对表进行更新操作
禁止操作:拥有共享行排他表级锁的事务将阻止其他事务获取行排他表级锁来修改数据,共享行排他表级锁还能阻止其他事务在相同表上获取共享表锁,共享行排他表级锁及排他表级锁
LOCK TABLE table IN ROW EXCLUSIVE MODE;
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
排他表级锁(exclusive table lock X):LOCK TABLE table IN EXCLUSIVE MODE;
允许操作:同一时间只有一个事务能获得表上的排他表级锁。一个事务获得表级锁后,其他事务只能对表进行查询操作
禁止操作:一个事务获得排他表级锁后,将禁止其他事务对表执行任何DML操作,其他事务无法获取表上任何类型的锁