数据库事务隔离性和锁,加深理解-阿里云开发者社区

开发者社区> 技术小甜> 正文

数据库事务隔离性和锁,加深理解

简介:
+关注继续查看

1.假设有一个事务A

1
2
3
4
5
6
-----事务A------- 
begin tran 
update [TestDB].[dbo].tb_score set score=score+1 where id=3 
   waitfor delay '00:00:10'   --延迟10秒读取 
SELECT *  FROM [TestDB].[dbo].tb_score 
commit TRANSACTION


它会运行10s左右,主要是更新表tb_score。在这10s期间,有语句对该表做查询。

1
SELECT *  FROM [TestDB].[dbo].tb_score

该语句会被阻塞,因为update会默认加上共享锁,直到10s后,事务A提交后才能查出结果。

以上语句就等介于下面的语句,因为事务隔离级别READ COMMITTED是SQLServer的默认设置。

1
2
3
4
5
SET TRANSACTION ISOLATION LEVEL 
READ committed 
begin tran 
SELECT *  FROM [TestDB].[dbo].tb_score 
commit TRANSACTION


此处,值得注意的事情是,在事务A中当update语句更新的时候,如果要更新的目标值=现在的值,比如,在id=3的记录,score已经等于100了的情况下,语句如果是update [TestDB].[dbo].tb_score set score=100 where id=3。那么执行SELECT *  FROM [TestDB].[dbo].tb_score将不被阻塞。原因猜测是sql不对这种实际不做更改的Update语句加锁

     

2.还是以上事务A

把查询语句改为如下

语句B:

1
2
3
4
5
SET TRANSACTION ISOLATION LEVEL 
READ uncommitted 
begin tran 
SELECT *  FROM [TestDB].[dbo].tb_score 
commit TRANSACTION

此时

SELECT *  FROM [TestDB].[dbo].tb_score语句被允许“脏读”

该查询未等事务A提交,就已经读出,并且读书的值为A以修改但未提交的值。

例如id=3的score=100,运行A事务的时候,score=101了,此时运行语句B,则立刻返回出id=3的score=101,而不管A是否真的已经提交或者rollback。

还有一点要注意,当你设置了READ uncommitted,那么接下来的sql语句都会是 READ uncommitted。msdn上:一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为。所以在查询分析器中做实验的时候,要注意,一旦设置了READ uncommitted,接下来在当前窗口中的语句都是如此。

3

1
2
3
4
5
-----事务A------- 
begin tran 
select *from  [TestDB].[dbo].tb_score with(tablockx) where id=3 
   waitfor delay '00:00:10'   --延迟10秒读取 
commit TRANSACTION


此事务对表加了表级别的排它锁。因此在此期间,

1
2
3
4
5
SET TRANSACTION ISOLATION LEVEL 
READ uncommitted 
begin tran 
SELECT *  FROM [TestDB].[dbo].tb_score where id=1 
commit TRANSACTION

更多内容,可以看

http://msdn.microsoft.com/zh-cn/library/ms187373.aspx

http://msdn.microsoft.com/zh-cn/library/ms173763.aspx    

4

此处有些疑问:

两个事务   

1
2
3
4
5
6
7
8
9
10
11
-----事务A-------
 begin tran 
 select *from  [TestDB].[dbo].tb_score with(updlock,rowlock) where id=3    waitfor delay '00:00:10'   --延迟10秒读取 
 update  [TestDB].[dbo].tb_score set score=score+1  where id=3 commit TRANSACTION
 
-----事务B------ 
SET TRANSACTION ISOLATION LEVEL READ committed 
begin tran 
select *from  [TestDB].[dbo].tb_score with(updlock,rowlock) where
id=3
commit TRANSACTION

我的理解是,事务A运行的时候,对id=3的加了行锁,还有更新锁,更新锁的话一定要等到事务运行完才能再被获取。   
因此事务A运行的时候,事务B也马上运行,但是事务B也要对改行获取更新锁,因此被阻塞在此,所以最后运行的结果是A运行完了B在运行。以上一切正常

但是把事务B改成   

-----事务B------- 

1
2
3
4
SET TRANSACTION ISOLATION LEVEL READ committed 
begin tran 
select *from  [TestDB].[dbo].tb_score with(updlock,rowlock) where id=1
commit TRANSACTION

事务B对id=1的行加锁。   
那么我的理解是,既然事务A加锁的对象是id=3的行,那么和事务B根本不会有什么冲突。但是事实上,运行事务A后马上运行B,发现事务B也会被阻塞。并且事务A还会发出异常错误:说是检测到死锁。    
Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

本人愚钝,百思不解,求专家指教。
























本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/638055 ,如需转载请自行联系原作者







版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10099 0
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
570 0
数据库事务ACID
数据库事务 数据库事务有严格的定义,它必须同时满足4个特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID。
835 0
技术原理:MySQL数据库事务浅析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaobryant/article/details/80539558 在SQL编程中,事务编程已然成为必不可少的一个组成部分。
2298 0
事务ACID属性与隔离级别
概念 数据库领域中的事务指的是一系列对数据库的操作集合,是数据库管理系统(DBMS)定义的一个执行单位。事务的作用体现在两个方面: 在并发访问数据库的场景中,利用事务来隔离多个应用程序的操作,避免多个操作彼此之间相互影响 提供一种从失败中恢复到正常状态的方法,同时提供数据库即使在异常状态仍能保持一致性的方法 当然以上两条是事务理论上应该持有的特性,但是实际应用过程中,由于业务需求的不同或配置方式不同,事务对以上两个方面的满足程度也不尽相同。
967 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13895 0
数据库事务特征、数据库隔离级别,各级别数据库加锁情况(含实操)--Repeatable Read && MVCC
上节回顾 上两篇记录了我对MySQL 事务 隔离级别** read uncommitted **、MySQL 事务隔离级别 read committed+MVCC 的理解。
1007 0
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
标签 PostgreSQL , 只读 , 锁定 , readonly , recovery.conf , 恢复模式 , pg_is_in_revoery , default_transaction_read_only 背景 在一些场景中,可能要将数据库设置为只读模式。 例如, 1、云数据库,当使用的容量超过了购买的限制时。切换到只读(锁定)模式,确保用户不会用超。 2、业务上需要对
2270 0
+关注
10146
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载