程序上面,一般不使用 悲观锁

本文详细介绍了如何在数据库中使用乐观锁机制,通过增加最后更新人和时间字段,确保在用户输入并尝试更新数据时,能准确判断数据是否被他人修改。此方法适用于需要频繁更新数据的应用场景,有效防止并发冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序上面,一般不使用 悲观锁 的。
大多数情况下,是用乐观锁。
每个表后面,增加一个 最后更新人 varchar 与 最后更新时间 datetime 这2个字段。

每次检索的时候,先把表的信息检索进来, 包含 最后更新人 varchar 与 最后更新时间 datetime 这2个字段。

当在 用户输入画面那里输入数据完毕以后, 要更新数据的时候。
UPDATE  表
SET  用户输入的字段  =  用户输入的信息
    最后更新人 = 当前用户
    最后更新时间 = 数据库时间
WHERE
    主键的条件
  AND 最后更新人 =  上一次检索时候的“最后更新人”
  AND 最后更新时间 = 上一次检索时候的“最后更新时间”

然后根据执行结果返回的 “更新行数”, 来判断,本次执行成功了没有
如果 “更新行数” = 1 , 说明执行成功。
如果 “更新行数” = 0, 说明数据在此期间,已经被别人修改了。这个时候,提示用户,数据保存失败。
数据库锁机制是为了保证数据的一致性和完整性,在并发环境下对共享资源进行访问控制的重要手段。其中最常用的两类锁定策略分别为悲观锁乐观锁。 ### 悲观锁 **特点** - **假设冲突发生频率较高** 认为数据在操作过程中极有可能遭遇修改,因此在整个事务期间都会将目标行加锁处理,直到交易结束才会释放这把“钥匙”。这种做法可以有效避免脏读、可重复读以及幻影读的问题,但同时也降低了系统的吞吐量响应速度。 - **适用场景** 当应用程序对于一致性要求非常高,并且预计会有较多的更新竞争时较为适合采用这种方式来进行同步保护;此外,如果业务逻辑比较复杂难以回滚的话也可以优先考虑此方案。 #### 实现方式 - `SELECT ... FOR UPDATE` : 对查询结果集施加排他性的X锁(exclusive lock),阻止其他会话对该记录做更改直至当前事物提交或撤销; - 行级锁定(Row-Level Locking)等技术也常用于降低锁范围带来的负面影响; ### 乐观锁 **特性** - **认为冲突较少** 相信大多数时候会遇到并发修改的情况,所以并会事先阻塞别人的操作权限,而是在准备完成所有变更之后再检查是否有人抢先一步改变了同样的内容。如果有则返回失败信息给前端提示用户刷新页面并重试新的编辑流程。 - **优点明显** 这种思想下的程序通常具备更好的性能表现,因为它允许更多的并发请求同时执行而必担心互相干扰导致效率低下等问题的发生。 #### 具体措施 - 版本号法:每次插入新版本的数据的同时增加version字段值,当两个以上客户端尝试修改同一条纪录的时候就会比对各自持有的计数器数值大小来确定谁先到达终点获得胜利。 - 时间戳校验:类似于上面提到的办法只过这里借助了系统自带的时间属性来做对比判断而已。 综上所述,选择哪种类型的锁定取决于具体的使用环境和个人偏好等因素综合考量的结果: 1. 如果您的应用场景下存在大量高并发写入任务并且无法接受长时间等待造成的延迟现象那么应该倾向于运用乐观模式; 2. 反之若更看重安全稳定高于一切,则推荐利用悲观态度构建起坚固防线保障每一笔账目的准确无误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值