2019独角兽企业重金招聘Python工程师标准>>>
从程序员角度,分为乐观锁,悲观锁。
乐观锁它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚;
使用最多的实现机制,是在操作的数据库表中增加一个Version字段,在进行数据库操作之间,查询出version的值,等到语句执行完后,将version+1,存入进去。将是当进行update 操作时,加上where version = XXX. 如果在执行这条语句的时候,其他语句将这个version的值改变了,则该条语句就将会执行失败。
悲观锁:悲观锁则是依赖于数据库的锁机制。看一下
从数据库的角度,分为。表级锁,页级锁,行级锁。我们一Mysql为例,所有的锁机制都是由数据存储引擎来决定的。Mysql的Innodb数据存储机制实现了行级锁。
表级锁:分为读锁,写锁。
行级锁:共享锁,排他锁,更新锁
- 独占锁(Exclusive Lock)
独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。
- 共享锁(Shared Lock)
共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。
- 更新锁(Update Lock)
更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。
事务隔离机制(封锁协议)
事务隔离机制决定了例如何时申请 排他锁 或 共享锁、持锁时间、何时释放等。
参照:http://comedsh.iteye.com/blog/698733