锁的基础知识
什么是锁
在sql server中,我们将sql server 当做一个小超市,每一条执行语句当成一件事,做这件事需要时间,假设一次只能做一件事,那么锁就是定义哪件事先做,按某种顺序执行所有的事情。
为什么需要锁
按照刚刚的理解,假设这么一个场景,今天小赖过来订了2箱喜力,要到店里取货,刚好店里不够,需要找供应商进货,那么此时肯定需要货到了才能让小赖来取,此时锁的意义就出现了,他保证供应商供货这件事完成之后,小赖才能取货。那么此时如果小赖已经来了,则小赖需要等待,这就是锁的规则,处理相关的事务,同时间只能执行一个。
补充小知识点(事务,ACID属性)
单纯的理解锁是不够的,还需要知道事务以及ACID属性,
何为事务,ACID原则
事务定义:(通过百度摘抄)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
ACID原则定义: ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).这是可靠数据库所应具备的几个特性.
继续看回上面的案例,将小超市要找供应商进货这个事项定义为事务,咱们可以分成以下几个小步骤:
1.找供应商订货(采购单)
2.供应商送货(送货登记)
3.付钱 (交易) —PS:为了便于理解,加入这个事项
4.货物进仓库(入库)
这4个小步骤为一个整体,合并成进货的这个事务,要么都执行,要么都不执行,如果其中一个失败,则,执行成功的步骤也会被回滚。即第一个原则,原子性。事务中每一个步骤为一个原子,不可分割,所有原子执行成功,事务才会提交,否则已经执行的任何操作都必须被撤销,让数据库返回初始状态
我们在看第4小点,当你付钱给供应商的时候,假设你付款成功的时候银行断电了,那么此时你的钱会消失吗?这显然是不允许的,银行服务启动时,钱可能会到达供应商账户,也可能因为错误因素返回你的账户。即第二原则,一致性。事务操作成功后,数据库所处的状态和他的业务规则是一致的,即数据不会被破坏。
接着我们看案例中的另外一部分,同样我们将小赖来拿啤酒这个事项定义为另外一个事务,分为以下几个小步骤:
1.小赖着急喝酒,你没有通知他就来取货了(出库)
2.小赖付钱(交易)
3.带走啤酒(出库)
结合两个事务,小赖着急喝酒,来取货,此时如果供应商货物还没送到,则没有酒可以给小赖,小赖需要等待。即第三原则,隔离性。事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
最后,假设小赖付钱了搬不动啤酒,或者是其他因素导致带不走啤酒,当他再次来的时候还是把他的啤酒给他。即第四原则,持久性。可靠的数据库提供事务日志,(可以理解为你记录了小赖要两箱啤酒),提交事务成功后,会先记录到事务日志,在执行事务操作,如果执行事务操作前,数据库发生异常中断(如服务器断电断网,服务器崩溃,或者是断点),那么数据库会在重新连接后执行事务。如果是还未记录事务日志就已经中断的,数据库会前滚该操作,即数据库引擎会重做这些事务所做的所有修改
锁的类别
sqlserver中,常见锁有4大类:共享锁,意向锁,更新锁和排他锁。详细可以阅览link. 按照惯例,会结合上述案例继续讲解。
(1)共享锁:在SQL SERVER中,当事务要读取数据时,需要获取共享锁。(A在查看小商店的存货的时候,B也可以查看)
(2)意向锁:在SQL SERVER中,准确来说,意向锁并不是一种独立的锁,其主要作用在于获取锁的控制粒度(如,页,表,行等)。
(3)更新锁:在SQL SERVER中,准确来说,更新锁并不是一种独立的锁,而是由共享锁和排它锁组成的混合锁,其隔离级别高于共享锁,低于排他锁,更新锁能够预防锁升级而产生的死锁。
(4)排它锁:在SQL SERVER中,当事务要写数据、更细数据和删除数据时,需要获取排他锁。
我是小赖,今天学习sql,下期继续学习锁的知识