您的位置:首页 > 数据库

数据库事务隔离级别与锁

2016-08-14 12:55 218 查看
数据库事务隔离级别与锁

关键字: 事务 
一,事务的4个基本特征 

Atomic(原子性): 

事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要 

么全部成功,要么全部失败。 

Consistency(一致性): 

只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 

状态。 

Isolation(隔离性): 

事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 

确性和完整性。同时,并行事务的修改必须与其他并行事务的修改 

相互独立。 

Durability(持久性): 

事务结束后,事务处理的结果必须能够得到固化。 

以上属于废话 

二,为什么需要对事务并发控制 

如果不对事务进行并发控制,我们看看数据库并发操作是会有那些异常情形

Lost update: 

两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 

导致对数据的两个修改都失效了。

Dirty Reads: 

一个事务开始读取了某行数据,但是另外一个事务已经更新了此数 

据但没有能够及时提交。这是相当危险的,因为很可能所有的操作 

都被回滚。 

Non-repeatable Reads: 

一个事务对同一行数据重复读取两次,但是却得到了不同的结果。 

Second lost updates problem: 

无法重复读取的特例。有两个并发事务同时读取同一行数据,然后其 

中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成 

第一次写操作失效。 

Phantom Reads: 

事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查 

询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是 

因为在两次查询过程中有另外一个事务插入数据造成的。 

三, 数据库的隔离级别 

为了兼顾并发效率和异常控制,在标准SQL规范中,定义了4个事务隔

离级别,(ORACLE和SQLSERER对标准隔离级别有不同的实现 )

Read Uncommitted: 

直译就是"读未提交",意思就是即使一个更新语句没有提交,但是别 

的事务可以读到这个改变.这是很不安全的. 

Read Committed: 

直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后 

别的事务就能读到这个改变. 

Repeatable Read: 

直译就是"可以重复读",这是说在同一个事务里面先后执行同一个 

查询语句的时候,得到的结果是一样的. 

Serializable: 

直译就是"序列化",意思是说这个事务执行的时候不允许别的事务 

并发执行. 


四,隔离级别对并发的控制
 

下表是各隔离级别对各种异常的控制能力。
 LUDRNRRSLUPR
RUYYYYY
RCNNYYY
RRNNNNY
SNNNNN
 

 

 

 

 

 

 

 

 

(注:LU:丢失更新;DR:脏读;NRR:非重复读;SLU:二类丢失更新;PR:幻像读)

顺便举一小例。

MS_SQL:

--事务一

set transaction isolation level serializable

begin tran

insert into test values('xxx')

--事务二

set transaction isolation level read committed

begin tran

select * from test

--事务三

set transaction isolation level read uncommitted

begin tran

select * from test

在查询分析器中执行事务一后,分别执行事务二,和三。结果是事务二会等待,而事务三则会执行。

ORACLE:

--事务一

set transaction isolation level serializable;

insert into test values('xxx');

select * from test;

--事务二

set transaction isolation level read committed--ORACLE默认级别

select * from test

执行事务一后,执行事务二。结果是事务二只读出原有的数据,无视事务一的插入操作。

读者是否发现MS_SQL和ORACLE对并发控制的处理有所不同呢?

五,锁 

下表是锁的兼容或冲突情形。

现有 S U X

请求

S Y Y N

U Y N N

X N N N

 现有SUX
申请    
S YYN
U YNN
X NNN
 

 

 

 

 

 

 

 

oracle:

 

   


 

六,隔离级别与锁 

七,注意点


 

一般处理并发问题时的步骤:

1、开启事务。

2、申请写权限,也就是给对象(表或记录)加锁。

3、假如失败,则结束事务,过一会重试。

4、假如成功,也就是给对象加锁成功,防止其他用户再用同样的方式打开。

5、进行编辑操作。

6、写入所进行的编辑结果。

7、假如写入成功,则提交事务,完成操作。

8、假如写入失败,则回滚事务,取消提交。

9、(7.8)两步操作已释放了锁定的对象,恢复到操作前的状态。

 

对多表的操作最好一起取得锁,或则保证处理顺序;个人感觉还是前者好,虽然效率低一些

八,附 

查看锁

ORACLE:

select object_name,session_id,os_user_name,oracle_username,process,locked_mode,status

from v$locked_object l, all_objects a

where l.object_id=a.object_id;

MS_SQL:EXEC SP_LOCK
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: