通俗易懂SQL server 中的锁

之前讲了数据库中的事务,为了让事务顺利执行,就有了锁?

1:什么是锁?

顾名思义,就是防止保护被偷东西,那么在数据库中就是防止数据被偷也就是 数据不完整。

2:为什么要用锁? 因为有些时候会出错,要保证数据正常不出现问题就需要锁。

既然是防止数据被偷,那么什么情况下数据 会变得不完整呢? 一下就是错误实例:在多用户都用事务同时访问同一个数据资源的情况下,就会造成以下几种数据错误。

  • 更新丢失:多个用户同时对一个数据资源进行更新,必定会产生被覆盖的数据,造成数据读写异常。理解为他抢了别人的女朋友,女朋友丢失)
  • 不可重复读:如果一个用户在一个事务中多次读取一条数据,而另外一个用户则同时更新啦这条数据,造成第一个用户多次读取数据不一致。(类似拔河,一个要读一个要更新,打架了)
  • 脏读:第一个事务读取第二个事务正在更新的数据表,如果第二个事务还没有更新完成,那么第一个事务读取的数据将是一半为更新过的,一半还没更新过的数据,这样的数据毫无意义。(将别人吃了一半的面包抢走了,别人吃不了,你也吃不了)
  • 幻读:第一个事务读取一个结果集后,第二个事务,对这个结果集经行增删操作,然而第一个事务中再次对这个结果集进行查询时,数据发现丢失或新增。(公共厕所大号完了之后下个人继续,结果你发现东西没拿又返回过来拿东西,发现被拿走了)

3:如何使用锁?

了解锁的种类:

  • 共享锁(S):还可以叫他读锁。可以并发读取数据,但不能修改数据。也就是说当数据资源上存在共享锁的时候,所有的事务都不能对这个资源进行修改,直到数据读取完成,共享锁释放。
  • 排它锁(X):还可以叫他独占锁、写锁。就是如果你对数据资源进行增删改操作时,不允许其它任何事务操作这块资源,直到排它锁被释放,防止同时对同一资源进行多重操作。
  • 更新锁(U):防止出现死锁的锁模式,两个事务对一个数据资源进行先读取在修改的情况下,使用共享锁和排它锁有时会出现死锁现象,而使用更新锁则可以避免死锁的出现。资源的更新锁一次只能分配给一个事务,如果需要对资源进行修改,更新锁会变成排他锁,否则变为共享锁。
  • 意向锁:SQL Server需要在层次结构中的底层资源上(如行,列)获取共享锁,排它锁,更新锁。例如表级放置了意向共享锁,就表示事务要对表的页或行上使用共享锁。在表的某一行上上放置意向锁,可以防止其它事务获取其它不兼容的的锁。意向锁可以提高性能,因为数据引擎不需要检测资源的每一列每一行,就能判断是否可以获取到该资源的兼容锁。意向锁包括三种类型:意向共享锁(IS),意向排他锁(IX),意向排他共享锁(SIX)。
  • 架构锁:防止修改表结构时,并发访问的锁。
  • 大容量更新锁:允许多个线程将大容量数据并发的插入到同一个表中,在加载的同时,不允许其它进程访问该表。

什么是死锁?

一个事务1是处理A 完事之后去查询B ,另一个事务2是处理B 完事去查询A ,结果呢 事务1去查B 发现2用着,事务2去查A 发现1在用着,结果俩个人都在等着对方结束在进行,导致僵住。这样相互等待对方释放资源,造成资源读写拥挤堵塞的情况,就被称为死锁现象,也叫做阻塞。(好比过独木桥都双方卡在这了

但是数据库也不会一直让他们等待,搜索引擎会定期检测这种状况,一旦发现有情况,立马选择一个事务作为牺牲品。牺牲的事务,将会回滚数据。如何选择牺牲品用语句设置

set deadlock_priority  <low>

级别的话 low<normal<high   越低就牺牲

然而我们也可以主动出击,设置锁超时时间,一旦资源被锁定阻塞,超过设置的锁定时间,阻塞语句自动取消,释放资源,但是这种方式需要去程序处理之后的逻辑。

 

避免死锁的话可以 看这篇文章https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms191242(v=sql.105)?redirectedfrom=MSDN

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值