zoukankan      html  css  js  c++  java
  • 乐观锁和悲观锁

    乐观锁

    在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,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

  • 相关阅读:
    Discuz! 的编码规范
    Golang 并发编程指南
    Hyrum's Law
    从数组中将变量导入到当前的符号表
    map[interface {}]interface {} yaml文件解码
    迪基福勒检验
    约定式路由
    use of internal package github.com/gokratos/kratos/v2/internal/httputil not allowed
    See https://v8.dev/blog/mathrandom for details.
    Cast a value as a certain type
  • 原文地址:https://www.cnblogs.com/zsx-blog/p/6830662.html
Copyright © 2011-2022 走看看