事务4.3-事务与锁(锁)

数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严重影响应用的正常执行。

锁模式
1.共享锁(S锁):允许并发事务在封闭式并发控制下读取(select)资源。资源上存在共享锁时,任何其他事务都不能修改数据。读取操作一完成,就立即释放资源的共享锁,除非事务隔离级别设置为可重复读或更高级别,或者在事务持续时间内用锁定提示保留共享锁。
2.更新锁(U锁):更新锁是共享锁和排它锁的结合。更新锁意味着在做一个更新时,一个共享锁在扫描完成符合条件的数据后可能会转化成排它锁。
这里面有两个步骤:(1)扫描获取where条件时,这部分是一个更新查询,此时是一个更新锁。
(2)如果将执行写入更新,此时该锁升级到排他锁,否则,该锁转变成共享锁。
更新锁可以防止常见的死锁
3.排它锁(X锁):可以防止并发实物对资源进行访问。排它锁不与其他任何锁兼容。使用排它锁时,任何其他事物都无法修改数据,也不可读取,仅在使用NOLOCK提示或未提交读隔离级别时才会进行读取操作。

共享锁和排它锁的区别:当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。


悲观锁:悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生都会使用锁机制。
悲观锁会完成以下功能:锁住读取的记录,防止其他事务读取和更新这些记录。其他事务会一直阻塞,知道这个事务结束。
悲观锁实在使用了数据库的事务隔离功能的基础上,独享占用的资源,一次保证读取数据一致性,避免修改丢失。
悲观锁可以使用Repeatable Read事务,他完全买组悲观锁的要求。

乐观锁:乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西。
如果使用乐观锁,那么数据库就必须加版本字段,否则就只能比较所有字段,但因为浮点类型不能比较,所以实际上没有版本字段是不可行的。

原文地址:https://www.cnblogs.com/tian666/p/7852751.html