共享锁(shared lock):他读锁,可以并发读取数据,但不能修改。
排它锁(exclusive lock):独占锁、写锁,对数据资源进行增删改时,其他事务不可以操作这个资源,知道排它锁被释放,防止同时对同一资源多重操作。
更新锁(Update lock):防止死锁,两个事务对同一个数据进行先读取再修改的情况,不使用共享锁或排它锁。资源的更新锁只能分配给一个事务,如果要对资源进行修改,就会变成排它锁,否则会变成共享锁。
意向锁:表示SQL Server需要层次结构中中的某些底层资源上获取shared或exclusive,例如,放置在表级的共享意向锁,表示事务打算表的页或者行上放置共享锁。在表级设置意向锁可防止另一个事务随后在包含那页获取排它锁。
意向锁有着更好的性能,因为SQL Server仅在表级检查意向锁,这样可以事务可以安全获取该表的锁,而无需检查表中的行和页上的锁是否可以锁定整个表。
架构锁:在执行依赖于表架构的操作时,架构锁的类型为:架构修改(Sch-M)和架构稳定性(Sch-S),执行表的数据定义语言(DDL)操作使用架构修改锁,当编译查询时,使用架构稳定锁。
大容量更新锁(BU):向表中大容量复制数据并制定了TABLOCK提示使用,大容量更新锁允许进程将数据并发地大批量复制,防止其他不进行大容量复制的进程访问该表。
读取未提交时,读取数据不需要加共享锁,就不会和其他排它锁冲突。
读取已提交时,读操作要加共享锁,执行之后释放共享锁。
可重复读,读操作加共享锁,等待其他事务执行完毕后再释放共享锁。
可串行化,会一直持有该锁,锁定整个范围的键,知道事务完成。
死锁的意思是,多个事务在同一资源上相互占用,锁定对方所需要的资源,导致无法进行。
solution:在并发过程中,按照相同顺序访问表;在同一个事务中,同时锁定所需要的资源,减少死锁;升级锁定颗粒度,通过表级锁减少死锁概率。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁适合读多写少的场景,一般使用版本号机制或CAS算法。
悲观锁:假设一定会有冲突,屏蔽一切可能违反数据完整性的操作,直到事务提交。这对长事务来说会大幅削减并发处理能力。利用数据库中的锁机制来实现。