简单理解锁
前言
时间过的好快,自己毕业已经三年多了,从事工作也三年了。然后从做开发到现在,对数据的东西却是做的很少,一些数据脚本的优化自己也没有去了解过,只是不停地写代码。最近自己想想是该对数据库认真的了解一下了,最近自己也一直在学习前端的知识,还有java语言,其实数据库也是重中之重啊。所以今天翻开了新的一页,正好看到了事务与锁的这一章节,看完了,总结一下我想效果会更好,希望与大家 一起交流。。。。。
正文
排他锁
窗口一执行了一个事务,但是没有提交。接下来我们在窗口二执行下面操作。
我限制了五秒查询时间,超过五秒后下面提示了这样的话。就是因为排他锁的作用,因为排他锁是独自占用的,既然我一直在这个屋子,就不允许你别的人进来占用。我觉得也可以了解为独立卫生间,我要是占着马桶,及时我不大小便,我就占着,那么你其他人及时需要也没办法。
共享锁
读不读取共享锁是与隔离的级别有关系的,隔离的级别又分为 read uncommitted未提交,read committed已提交这个是默认值所以在我们上面说排他锁的时候窗口二查询不到数据,repeatable read 可重复读,serializable可序列化,snapshot快照,以及read committed snapshot 已经提交读隔离.
set Transaction isolation level read uncommitted;用来设置查询时隔离级别,level后是级别名称,如果上面的排他锁例子,在窗口二改一改那么我就可以读到数据了。
哇好开心啊,终于读到了。很可惜,这里我们又设计到了一个术语,脏读。就是说我们在未提交事务时,就去通过某种手段读取改后的数据这个过程就是脏读,如果我事务回滚了,那么你这个数据就不是真实的数据。如何防止脏读,那么其实我们说排他锁的时候就是了,默认的隔离级别是第二个,也就是防止脏读的最低级别。也就是你必须拿到共享锁才可以,那么read uncommitted就是说没有访问共享锁,所以他可以查到数据也就是脏数据不正确的数据。
对于什么是共享锁,我认为就是在查询时候执行任务用的就是共享锁,在serialation隔离级别下执行的事务共享锁是一直保留到事务提交,在不提交的时候是不允许插入修改的,那么我再看2008技术内幕说的只有在这个级别一下是可以插入的,但是我在sql2012上执行及时是serialation级别下也是不行的,至于幻影也是不可以的,可能是2012已经做了修改了吧。那么查询就无所谓了,我感觉是因为共享锁吗,都是用来查询的,那么大家都可以。就像公共厕所一样,你可以进去,我也可以进去。
基本的就是这个两个锁,再往后就是高级锁了,更新,意向,架构锁。
更新锁
begin tran
select * from WebSiteInfo.dbo.BookPlan with(updlock) where BookName='1'
waitfor delay '00:00:10'
insert WebSiteInfo.dbo.UserInfo(Name) values('niubi');
commit tran
更新锁只是简单的理解了一下,放置在可更新的资源(如行、页、表)上的锁。更新锁用于防止常见形式的死锁,这类死锁在多个会话锁定资源并且稍后可能更新资源时发生这是给出的定义。就说我更新只是针对我当前的操作加锁而不是对整个表加锁。
意向锁,架构还没有了解现在有事要做,只写写到这里。。。。。
总结
踏上这条路,没有后悔过,要学的东西还有很多很多,要成为一个合格的程序员还差的很远很远。
If every day is not easy, it will be easier for a day, and if it is easier for each day, it will not be easy for a day.