首页 > 代码库 > 乐观锁和悲观锁

乐观锁和悲观锁

乐观锁

在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。

给表增加一个表示该行版本号的字段(类型:时间戳),或者可以叫“版本戳”

版本号字段的方式有几种:

1:计数器,每次加1,必须要由服务器来生成,主节点保证

2:GUID,缺点数值大,且不知道版本先后

3:哈希码,同GUID,

4:时间戳,可以由多台服务器生成,但必须保证时间同步,如果每毫秒更新很多次,需要保证时间精度要够,否则可能重复

declare @count as int
DECLARE @flag AS TIMESTAMP
DECLARE @rowCount AS int
begin tran
select @count=COUNT,@flag=timesflag from ttt
update ttt set count=@count-1,timesflag= WHERE timesflag=@flag --这里加了条件
SET @rowcount=@@ROWCOUNT --获取被修改的行数
commit TRAN

--对行数进行判断即可
IF @rowCount=1
PRINT ‘更新成功‘
ELSE
PRINT ‘更新失败‘

 

悲观锁
declare @count as int
begin tran
select @count=count from tb WITH(UPDLOCK)--更新锁,保证自查询起直到事务结束不会被其他事务读取修改,避免产生脏数据
update tb set count=@count-1
commit tran

乐观锁和悲观锁