`
hz_chenwenbiao
  • 浏览: 994616 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

数据库事务隔离级别与锁(转)

阅读更多

一,事务的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:
直译就是"序列化",意思是说这个事务执行的时候不允许别的事务
并发执行.

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


下表是各隔离级别对各种异常的控制能力。

  LU DR NRR SLU PR
RU Y Y Y Y Y
RC N N Y Y Y
RR N N N N Y
S N N N N N

 

 

 

 

 

 

 

 

 

(注: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

  现有 S U X
申请        
S   Y Y N
U   Y N N
X   N N N


 

 

 

 

 

 

 

 

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

 

转载自:http://case0079.iteye.com/blog/205201

分享到:
评论

相关推荐

    数据库事务隔离级别

    介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响

    数据库_事务隔离级别与锁.docx

    数据库_事务隔离级别与锁

    数据库事务和隔离级别

    数据库事务和隔离级别

    数据库事务隔离级别.docx

    数据库事务隔离级别.docx数据库事务隔离级别.docx数据库事务隔离级别.docx

    MY SQL 事务隔离 查询:默认事务隔离级别

    查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别

    MySQL数据库事务隔离级别详解

    数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。 Repeatable read:可以防止脏...

    四种隔离级别与锁

    数据库事务的四种隔离级别的特点描述,他们的使用热度,以及各种锁在隔离级别下的释放时机。

    mysql数据库事务隔离级别借鉴.pdf

    mysql数据库事务隔离级别借鉴.pdf

    MySQL数据库:事务隔离级别.pptx

    事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...

    mysql数据库事务隔离级别[参照].pdf

    mysql数据库事务隔离级别[参照].pdf

    数据库事务与隔离技术

    通过此文档,让你完全了解数据库事务与隔离技术,SQL SERVER,ORACLE在不同事务隔离级别的区别,以及两种数据库本身的特点

    数据库事务的隔离级别1

    目录 数据库事务的隔离级别 2 数据库ACID理论 2 原子性 2 一致性 2 隔离性 2 持久性 3 事务隔离级别 3 Read Uncommitted(读取

    MSSQL与Oracle数据库事务隔离级别与锁机制对比

    同时,并行事务的修改必须与其他并行事务的修改 相互独立。 Durability(持久性): 事务结束后,事务处理的结果必须能够得到固化。 以上属于废话 二,为什么需要对事务并发控制 如果不对事务进行并发控制,我们看...

    数据库事务与隔离级别.docx

    数据库中事务的四大特性(ACID

    数据库事务的四大特征以及隔离级别

    持久性(Durability):持久性指对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。 2. 隔离级别 Serializable(串行化):可避免脏读、不可重复读、幻读的发生。 Rep

    数据库事务及锁机制面试题

    性能高和事务完全隔离性无法同时满足,DB提供了4项事务隔离级别来权衡,需要用户根据自身业务来选择合适的隔离级别。隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。我们的数据库锁,...

    spring常用数据库事务传播属性和事务隔离级别1

    事务的属性:1.Propagation:用来设置事务的传播行为事务的传播行为:一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启了一个新

    常见的数据库事务隔离级别

    为什么会出现数据库的隔离级别呢? 数据库隔离级别是为了解决数据库并发访问过程中产生的各种数据安全问题. 事务的基本要素(ACID) 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能...

    oracle 数据库隔离级别学习

    oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争。 不可重复读(Nonrepeatable reads) 同一查询在同一事务中...

Global site tag (gtag.js) - Google Analytics