`
jubincn
  • 浏览: 242622 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

悲观锁和乐观锁 转自:http://www.cnblogs.com/ego/articles/1456317.html

 
阅读更多

转自:http://www.cnblogs.com/ego/articles/1456317.html

悲观锁和乐观锁


——《POJOs in Action》读书笔记(一)

1事务隔离

事务隔离是数据库提供的功能。

SQL Server通过SET TRANSACTION ISOLATION LEVEL语句设置事务隔离级别:

SET TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SNAPSHOT

| SERIALIZABLE

}

[ ; ]

Read Committed是SQL Server的预设隔离等级。

1.1READ UNCOMMITTED

Read UnCommitted事务可以读取事务已修改,但未提交的的记录。

Read UnCommitted事务会产生脏读(Dirty Read)。

Read UnCommitted事务与select语句加nolock的效果一样,它是所有隔离级别中限制最少的。

1.2READ COMMITTED

Read Committed事务不能读取事务已修改,但未提交的记录。

Read Committed是SQL Server的预设隔离等级。

1.3REPEATABLE READ

Repeatable Read事务不能读取交易已修改,但未提交的记录,并且在事务完成之前,任何其它事务都不能修改目前事务已读取的记录。

其它事务仍可以插入新记录,但必须符合当前事务的搜索条件——这意味着当前事务重新查询记录时,会产生幻读(Phantom Read)。

1.4SNAPSHOT

Snapshot事务中任何语句所读取的记录,都是事务启动时的数据。

这相当于事务启动时,数据库为事务生成了一份专用“快照”。

在当前事务中看到不其它事务在当前事务启动之后所进行的数据修改。

Snapshot事务不会读取记录时要求锁定,读取记录的Snapshot事务不会锁住其它事务写入记录,写入记录的事务也不会锁住Snapshot事务读取数据。

1.5SERIALIZABLE

Serializable事务会产生以下效果:

1.语句无法读取其它事务已修改但未提交的记录。

2.在当前事务完成之前,其它事务不能修改目前事务已读取的记录。

3.在当前事务完成之前,其它事务所插入的新记录,其索引键值不能在当前事务的任何语句所读取的索引键范围中。

Serializable事务与select语句加holdlock的效果一样。

2READ COMMITTED和REPEATABLE READ

Read Committed和Repeatable Read是最常用的两种事务。

Read Committed是SQL Server的默认级别;而Repeatable Read比Read Committed更能保证数据一致性。

2.1特点

Read Committed会阻塞其它事务中的update,但不会阻塞select。

Repeatable Read不但会阻塞其它事务中的update,还会阻塞select。

Read Committed和Repeatable Read的相同点是:都会阻塞其它事务的update语句。

Read Committed和Repeatable Read的不同点是:Read Committed不会阻塞其它事务的select语句,但Repeatable Read阻塞。

注意,Read Committed和Repeatable Read都是行级锁,它们只会锁住与自己相关的记录。当事务提交之后,阻塞的语句就会继续执行。

2.2理解

2.2.1READ COMMITTED

Read Committed事务的含义是我select出来的记录,别人只能看,不能改(只阻塞别的事务的update)。

Read Committed的缺点是:无法防止读取不一致和修改丢失。

读取不一致是因为Read Committed不锁住读取的记录;修改丢失是因为别的事务也能读取当前事务的记录,虽然会阻塞别的事务的update,但在当前事务提交之后,别的事务的update语句会继续执行,进而覆盖上一次事务的结果,导致上一次的修改丢失。

2.2.2REPEATABLE READ

Repeatable Read事务的含义是我select出来的记录,不允许别人看,也不允许别人改(阻塞别的事务select、update),这就意味着我可以在事务中多次select数据,而不用担心出现“脏读”——这就是“可重复读取”的意思。

Repeatable Read虽然解决了Read Committed事务的读取不一致和修改丢失的缺点,但它也有缺点(尽管这个缺点Read Committed也有):

Repeatable Read不会阻塞insert和delete,所以会出现“幻读”——两次select的结果不一样。还有,Repeatable Read占用的资源比Read Committed大。

3在应用程序中设置事务隔离级别

READ COMMITTED是Microsoft SQL Server Database Engine的预设隔离等级。

已指定隔离等级时,在SQL Server工作阶段中,所有查询和数据操作语言(DML)陈述式的锁定行为都会在此隔离等级运作。此隔离等级会维持有效,直到工作阶段结束或隔离等级设为另一个等级为止。

如果应用程序必须在不同隔离等级操作,可以使用下列方法来设定隔离等级:

l执行SET TRANSACTION ISOLATION LEVEL Transact-SQL陈述式。

l如果ADO.NET应用程序使用System.Data.SqlClient管理的命名空间,可以使用SqlConnection.BeginTransaction方法来指定IsolationLevel选项。

l使用ADO的应用程序可以设定Autocommit Isolation Levels属性。

l当启动交易时,使用OLE DB的应用程序可以将isoLevel设为所要的交易隔离等级,以呼叫ITransactionLocal::StartTransaction。当在自动认可模式中指定隔离等级时,使用OLE DB的应用程序可以将DBPROPSET_SESSION属性DBPROP_SESS_AUTOCOMMITISOLEVELS设为所要的交易隔离等级。

l使用ODBC的应用程序可以使用SQLSetConnectAttr来设定SQL_COPT_SS_TXN_ISOLATION属性。

4悲观锁

悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制。

悲观锁会完成以下功能:锁住读取的记录,防止其它事务读取和更新这些记录。其它事务会一直阻塞,直到这个事务结束。

悲观锁是在使用了数据库的事务隔离功能的基础上,独享占用的资源,以此保证读取数据一致性,避免修改丢失。

悲观锁可以使用Repeatable Read事务,它完全满足悲观锁的要求。

5乐观锁

乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西。

如果使用乐观锁,那么数据库就必须加版本字段,否则就只能比较所有字段,但因为浮点类型不能比较,所以实际上没有版本字段是不可行的。

6死锁

当二或多个工作各自具有某个资源的锁定,但其它工作尝试要锁定此资源,而造成工作永久封锁彼此时,会发生死锁。例如:

1.事务A取得数据列1的共享锁定。

2.事务B取得数据列2的共享锁定。

3.事务A现在要求数据列2的独占锁定,但会被封锁直到事务B完成并释出对数据列2的共享锁定为止。

4.事务B现在要求数据列1的独占锁定,但会被封锁直到事务A完成并释出对数据列1的共享锁定为止。

等到事务B完成后,事务A才能完成,但事务B被事务A封锁了。这个状况也称为「循环相依性」(Cyclic Dependency)。事务A相依于事务B,并且事务B也因为相依于事务A而封闭了这个循环。

例如以下操作就会产生死锁,两个连接互相阻塞对方的update。

连接1:

begin tran

select * from customers

update customers set CompanyName = CompanyName

waitfor delay '00:00:05'

select * from Employees

–因为Employees被连接2锁住了,所以这里会阻塞。

update Employees set LastName = LastName

commit tran

连接2:

begin tran

select * from Employees

update Employees set LastName = LastName

waitfor delay '00:00:05'

select * from customers

--因为customers被连接1锁住了,所以这里会阻塞。

update customers set CompanyName = CompanyName

commit tran

SQL Server遇到死锁时会自动杀死其中一个事务,而另一个事务会正常结束(提交或回滚)。

SQL Server对杀死的连接返回错误代码是1205,异常提示是:

Your transaction (process ID #52) was deadlocked on {lock | communication buffer | thRead} resources with another process and has been chosen as the deadlock victim. Rerun your transaction.

除了Read UnCommitted和Snapshot,其它类型的事务都可能产生死锁。

分享到:
评论

相关推荐

    android IM

    http://www.cnblogs.com/not-code/archive/2011/07/16/2108369.html 成功解决asmack不能收发文件的问题 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=81207 asmack :...

    sso详细设计说明书(下篇)转载(海纳百川文章http://www.cnblogs.com/David-weihw/a)

    “工具”可能指的是实现SSO所需的辅助工具或服务,如数据库用于存储用户信息,密钥管理工具用于安全地生成和存储令牌,以及可能的API网关或负载均衡器来协调SSO服务和应用系统之间的通信。 至于"Passport"这个...

    webApi请求插件PostMan

    webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客...

    C# 简单的作业调度

    ,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:...

    C# 并发测试

    存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发处理。存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发处理...

    Web 断点续传批量上传上传工具

    开发文档-ASP.NET:http://www.cnblogs.com/xproer/archive/2012/02/17/2355469.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/02/17/2355449.html 示例下载:...

    谷歌开源的Google Preview Image Extractor.zip

    这个项目可以考虑用在特定情况下加速加载无损格式的预览图,提升用户体验 该项目没有demo代码,demo代码可参考博客园的一位网友的文章:http://www.cnblogs.com/tntmonks/p/5143350.html 标签:无损图片

    .net C# 学习过程中收藏的一些比较有用的和感兴趣的链接

    http://www.360doc.com/userhome.aspx?userid=19107491&cid=3 jQuery基本选择器及用法 前端模块化开发(AMD和CDM规范) ...http://www.cnblogs.com/dwlsxj/p/4052871.html 浅析MSIL中间语言——PE文件结构篇

    HSQLDB安装与使用-转自http://www.cnblogs.com/wllyy189/archive/2008/11/15/1334002.html

    HSQLDB因其简单易用、快速启动和关闭、体积小、内存数据库特性而被广泛应用于测试环境和小型项目中。 **安装HSQLDB** 1. **下载**: 首先,你需要从官方网站或者第三方源(如Apache镜像站点)下载HSQLDB的最新版本...

    bndong https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2/#/

    bndong https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2/#/

    23种设计模式的java实现

    抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html 工厂方法 http://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html 建造者模式 ...

    开源GIS最著名的地图投影库Proj.4库

    Proj.4的功能主要有经纬度坐标与地理坐标的转换,坐标系的转换,包括基准变换等。...和 https://www.cnblogs.com/oloroso/p/5672837.html cmake下载与安装:https://www.cnblogs.com/chenyaling/p/10894084.html

    JS截屏控件

    开发文档-ASP.NET(C#):http://www.cnblogs.com/xproer/archive/2010/12/04/1896552.html 开发文档-PHP:http://www.cnblogs.com/xproer/archive/2011/05/16/2047915.html 开发文档-JSP:...

    MVC5&EF6入门教程_Part3

    转自:http://www.cnblogs.com/miro/p/4030622.html 整理到了doc文档里,内含代码。 方便一起学习。

    根据本地浏览器的版本自动更新chromedriver 自适应114版本以前的版本,也适应之后的版本115、116、117、118

    https://www.cnblogs.com/interdrp/p/17650069.html 在此提交bug 有需要的自行下载 https://sms.reyo.cn/test/v2.zip 2023-08-24 已更新自适应版本下载,不再需要配置不同版本的ini文件了,请保持对应关系即可!!!...

    Android代码-SmartPopupWindow

    PopupWindow不响应点击外部消失和返回键消失的解决方法博文地址:http://www.cnblogs.com/popfisher/p/5608717.html PopupWindow精确计算要显示位置原理和方法博文地址:...

    CKFinder.v2.4.1.完美注册版.ha666.zip

    CKEditor+CKFinder使用与配置:http://www.cnblogs.com/dmeiyang002/p/3808307.html 官网地址:http://ckeditor.com CKEditor下载地址:http://ckeditor.com/download CKFinder(免费版本)下载地址:...

    一个牛人提供的GIS源码(很好)

    用SetupFactory打包MapX(带打好的包和打包文档以及录像) http://www.cnblogs.com/Tangf/archive/2006/02/05/325842.html ┕打包以及文档和录像:http://www.cnblogs.com/Files/Tangf/Mapx_Pack.rar 再谈MAPX打包以及...

    学员管理系统

    学员管理系统是一种专为教育机构设计的信息管理工具,旨在优化教务流程,提升工作效率,并确保学员信息的安全和有序。系统的核心目标是实现学员信息的高效存储、检索和管理,以支持教育机构的各项教学活动。 SSH...

    IP_V6.0_06_zh_AZI0130X.hdx

    http://www.cnblogs.com/kzloser/articles/2582349.html ———————————————— 版权声明:本文为CSDN博主「海阔天空sky1992」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明...

Global site tag (gtag.js) - Google Analytics