Oracle-锁机制(1)

性能优化一般是指系统缓慢,只有系统缓慢了才需要优化,一般有两种情况,一种是系统的资源严重不足,比如CPU耗尽了,或者I/O到了瓶颈了,由于系统的资源被耗尽导致系统性能无法再提升。另外一种情况就是阻塞,这个系统的资源使用并不高,为什么程序跑的特别慢,这种情况通常是阻塞导致的,并不是资源处理不过来。

当真的是系统资源枯竭了,那么只能扩充系统的硬件性能,由于系统阻塞导致的这个就和业务设计有关系了,这样就和系统无关了。

 

 

从一个最简单的例子感受锁的存在

 

为什么会有锁
没有并发就没有锁! 

 

Oracle中锁的分类
Enqueues---队列类型的锁,通常和业务相关的。
Latches ---系统资源方面的锁,比如内存结构,SQL解析......

锁分为两类队列和Latches,Enqueues保证资源以一种队列的方式。大家都喜欢把锁叫做Lock,其实Enqueues就是锁,在v$lock里面可以看到查出来的是Enqueues(通常由DML操作导致的锁叫做Enqueues)。

另外一方面的锁就是Latches,Latches是用来保护资源的,比如访问某些内存结构,如哈希表,链这些结构。访问这些结构要获得某方面的授权,这方面的保护机制就是Latches。

 

锁的原则
� 只有被修改时,行才会被锁定。
� 当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升
级。
� 当某行被修改时,它将阻塞别人对它的修改。
� 当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行
的修改。
� 读永远不会阻止写。(比如一个查询需要5分钟,在这5分钟里面可以将表truncate)
读不会阻塞写,但有唯一的一个例外,就是select ...for update。
� 写永远不会阻塞读。
当一行被修改后,Oracle通过回滚段提供给数据的一致性读。

 

Oracle锁的类型
SQL> select type,name from V$lock_type;
TYPE NAME
---------- ----------------------------------------
WM WLM Plan Operations
CI Cross-Instance Call Invocation
PR Process Startup
AK GES Deadlock Test
DI GES Internal
RM GES Resource Remastering
PE Parameter
PG Global Parameter
FP File Object
RE Block Repair/Resilvering
KD Scheduler Master DBRM
KM Scheduler

 

TM锁和TX锁
�TM 表锁,发生在insert,update,delete以及select for update操作时,目的是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。
�TX锁事务锁(行锁)对于正在修改的数据,阻止其它会话进行修改。对业务性能影响最大的锁也就是TX锁和TM锁,虽然锁的种类很多。

TM锁:在操作一张表的时候,总要保证这张表的完整性,比如你在更新这张表,其他如在你更新表的时候将表给删除了,那么这个事务就不完整了。在oracle下面为了保证事务的完整性就会在表上面加上锁,防止别人对其DDL操作。

TX锁:如果在修改数据的时候,就要在数据上面加上锁,就是在被修改的数据上面加上锁,这就是行级锁。

 

当我要修改一张表的时候,要在这个表上面加两种锁,一个是要修改的数据,一个是表级锁。在修改的数据上面加上TX锁,是行级的,同时要在表级加上一个表级锁,行级锁的目的是你要修改的数据别人不能再修改,表级锁的意义是在修改的时候别人不能对这个表做DDL操作,通过这两个层面保证事务完整性和安全性。

 

修改和TM,TX锁定 

 

如图,在这张表上面做UPDATE操作,会在要更新的行上面加一个排他锁TX,这是一个事务锁,同时在这张表上面会加一个表级锁。

只有被修改的那一行上面会加上一个事务锁,而在整张表上面会加上表级锁。

 

update的阻塞 

(1)使用test用户去修改数据

SQL> create table t(id int);

 

Table created.

 

SQL> insert into t values(1);

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> update t set id=id+1;

 

1 row updated.

 

(2)使用sys用户对t表进行更新

SQL> update t set id=id+1;  --这里更新不了发生了阻塞

(3)使用另外一个窗口查看阻塞的信息

select ... for update 的阻塞

SQL> select * from t where id=4 for update;

ID

----------

4

 

这个时候再去另外一个session里面去修改被select出来的行

SQL> update t set id=id+1 where id=4; --这里发生了阻塞

TM锁的几种模式----lock mode 模式越高,约束就越严格

Row Share (RS) --2
This lock, also called a subshare table lock (SS), indicates that the transaction holding the lock on the table has locked rows in the table and
intends to update them. A row share lock is the least restrictive mode of table lock, offering the highest degree of concurrency for a table.
Row Exclusive Table Lock (RX)---3
This lock, also called a subexclusive table lock (SX), generally indicates that the transaction holding the lock has updated table rows or issued SELECT ... FOR UPDATE. An SX lock allows other transactions to query, insert, update, delete, or lock rows concurrently in the same table.Therefore, SX locks allow multiple transactions to obtain simultaneous SX and subshare table locks for the same table.
Share Table Lock (S) --4
A share table lock held by a transaction allows other transactions to query the table (without using SELECT ... FOR UPDATE), but updates are allowed only if a single transaction holds the share table lock. Because multiple transactions may hold a share table lock concurrently,
holding this lock is not sufficient to ensure that a transaction can modify the table.
Share Row Exclusive Table Lock (SRX) ---5
This lock, also called a share-subexclusive table lock (SSX), is more restrictive than a share table lock. Only one transaction at a time can acquire an SSX lock on a given table. An SSX lock held by a transaction allows other transactions to query the table (except for SELECT ... FOR UPDATE) but not to update the table.
Exclusive Table Lock (X) ---6
This lock is the most restrictive, prohibiting other transactions from performing any type of DML statement or placing any type of lock on the table. 

 

TM锁几种模式的互斥关系

可以看到当表上面有6级锁了,就不能往表上加任何锁了。当一个表上加上了四级锁的时候,其他会话都不允许对表进行修改了,只能select,这样相对于串行了。

 

手工锁定的一个应用

SQL> lock table t in share mode;  --手工将t表进行锁定

Table(s) Locked.

可以看到TM锁的模式变为4了,其他会话不可以对表进行任何DML操作,只有当前会话可以对表进行DML操作。

SQL> update t set id=id+1;  --当前会话即手工执行郭对表加锁的语句对表进行更新,之后查看锁的情况。

2 rows updated.

在另外一个会话对表进行修改

SQL> update t set id=id+1;           --这里被阻塞了,之后再去查看锁的情况

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值