一、ANSI/ISO事务的隔离级别指的是,一个事务对
数据库的
修改与另外一个事务的隔离程度 1.两个并发事务T1和T2在访问相同的行,可能存在的三种问题 a.幻像读取---T1通过where条件进行
查询返回的行,T2插入了新的纪录,正好满足T1的where的条件,这时T1再次
查询 看到了T2新插入的值,对于T1来说就像变魔术一样 b.不可重复读取---T1读取了1行,这时T2
修改了T1读取的纪录,当T1再次读取的时候发现数据不一样了,这个称为 不可重复读 c.脏读---T1更新了1条纪录的
内容但是并没有进行提交,T2读取更新后的行,然后T1执行了回滚,T2所读取的行就无效了 2.为了处理上述问题,
sql标准定义了几种事务隔离级别,按照隔离性级别从低到高依次为 a. READ UNCOMMITTED :幻像读、不可重复读和脏读都允许 b. READ COMMITTED :允许幻像读和不可重复读,但是不允许脏读 c. REPEATABLE READ :允许幻像读,但是不允许不可重复读和脏读 d. SERIALIZABLE :幻像读、不可重复读和脏读都不允许 二、oracle
支持READ COMMITTED和SERIALIZABLE两种事务的隔离级别,
不支持其他2种,oracle默认的隔离级别是READ COMMITTED,这里其实由于undo的作用不会出现脏读 三、事务的隔离级别可以使用 set transaction 语句设置 set transaction isolation level serializable; 四、锁模式 1.排他锁:简记为X锁,T1对数据对象A
加上X锁,则只允许T1读取和
修改A,其它任何事务都不能再对A加任何类型的锁,直到T1释放A上的锁。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁 2.共享锁:共享锁又称为读锁(Share lock,简记为S锁),若事务T1对数据对象A
加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T1释放A上的S锁。 五、oracle锁
分类 分为三大类 1.dml锁,主要是保护数据,主要有表锁和行锁,防止并发的ddl和dml操作导致的破坏 分为2类 a.Row lock(TX) 行上的锁,insert、update、delete、merge、select ... for update,和别的
数据库需要单独的在内存中存在一个锁列表不同,oracle是通过在数据块 头部包含行锁的信息的 V$TRANSACTION视图列出了活动的事务 b.Table locks(TM) 表上的锁,insert、update、delete、merge、select ... for update,lock table语句 这里又分为几类 i.Row Share (RS):行共享锁 也叫做subshare table lock (SS),表示事务在表上的锁主要是锁定表中的行,行共享锁是表锁中最不受限制 的模式,为表提供了最高的并发度 ii.Row Exclusive Table Lock (RX) 也叫做subexclusive table lock (SX),一般指的是更新表行的时候持有的锁或者select for update语句,它允许其他事务 select,insert,update,delete或同时在同一个表上进行行锁,因此sx允许多个事务
获取同一个表的SX和subshare表锁 iii.Share Table Lock (S) 一个表级共享锁,允许其他事务select(不是select ... for update),但是只有当前保持共享锁的事务才可以
修改内容,又因为可以多个事务 都在表上加共享锁,因此保持此锁不一定可以
修改对应的
内容 iv.Share Row Exclusive Table Lock (SRX) 也可以叫做share-subexclusive table lock (SSX),它比S锁更严格,同一时刻只能有一个事务请求到ssx锁,请到到共享锁后,允许其他事务进行
查询,但是不可以进行 更新 v.Exclusive Table Lock (X) 这个是最严格的锁,它
禁止其他事务执行任何类型的dml语句或放置任何类型的表锁 2.ddl锁,主要是保护对象的结构,这里的ddl是data dictionary (DDL) lock,不是Data Definition Language, 从字面上看这个是数据字典锁,就是对数据对象进行加锁保护,ddl锁是oracle
自动控制的,
用户无法进行
显示请求 比如
用户创建一个存储过程,oracle会
自动在存储过程中定义的对象上加锁,主要是阻止在程序编译过程中这些对象被
修改或
删除 a.Exclusive DDL Locks b.Share DDL Locks c.Breakable Parse Locks 3.system锁,主要是保护内部数据结构 六、查看锁类型 1.我们执行下面的语句
sql> select * from dept for update; --查看这个会加什么锁
sql> select se.USERNAME,lo.type,decode(lo.lmode,'none',1,'null',2,'row-s(ss)',3,'row-x(sx)',4,'share',5,'s/row-x(ssx)',6,'exclusive',to_char(lo.lmode)) lmode from v$lock lo,v$session se where lo.sid=se.sid 2 and se.username='SCOTT'; USERNAME TY LMODE ------------------------------ -- ---------------------------------------- SCOTT TX exclusive SCOTT AE share SCOTT TM row-x(sx) --提一条TX表示的是事务锁也就是行锁,exclusive是排他锁,也就是行上的排他锁 --第二条AE表示的是编辑锁,share表示的时共享锁,也就是编辑共享锁 --第三条TM表示的是dml锁或对象锁也就是表锁,row-x(sx)表示的时行排他锁 这里可以通过v$lock_type来查看 其实在行上加的锁也就会
自动升级到表上,一个事务如果在行上加了一个锁的话,那么这个事务也会请求在表上
增加这个行锁,因此tm类型的锁区分为行和表,这里也就是为什么insert、update、delete、merge、select ... for update 即会造成tx锁也会造成tm锁