悲观锁和乐观锁分别在什么条件下使用?

时间:2022-09-21 09:21:48
1。在处理并发问题上,在什么条件下选择悲观锁?在什么条件下选择乐观锁?

2。有个同事写了个方法来解决并发,不知道有没有什么问题?

就是在一个事务里面 先用select money as 原始  from table
                   在用 update table set money=新值 where money=原始

这样来空值并发,对不对?

3。事务是隔离的,对于数据库来说是在一个时间点对一条记录只能有一个操作对吧?
   如果是这样我想上面控制并发没问题
4。不知道各位大哥在具体项目采用什么方法来解决并发的。
谢谢

13 个解决方案

#1


该回复于2010-04-29 12:37:29被版主删除

#2


自己顶下

#3


该回复于2010-04-29 16:13:41被版主删除

#4


你同事写的这种方法称为乐观锁。

乐观锁顾名思义就是在操作时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。

悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其先锁住,让别人用不了,我操作完成后再释放掉。

悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。

#5


一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁。

如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。

#6


IMHO,大部分应用,乐观锁足够了

#7


我同事写的这种方法没问题吧?

#8


当然有问题了,如果money主键/唯一,怎么可以随便更新?

#9


一般常见的检查,
表里有个revision字段,
将信息呈现给客户的时候,同时记住当前revision,
更新前检查相同id的记录的revision,ok的话,更新记录的同时,revision增加

#10


楼主同事既然用这个办法,那还不如这样子

UPDATE TABLE SET MONEY = MONEY + 变化的值 WHERE ID=?

#11


引用 8 楼 shine333 的回复:
当然有问题了,如果money主键/唯一,怎么可以随便更新?


这个是什么意思?你的意思说如果money是主键就不行?

#12


乐观锁,悲观锁 很大程度上由 冲突的频率决定

冲突几率大用悲观 ,小就用乐观

#13


引用 4 楼 bao110908 的回复:
你同事写的这种方法称为乐观锁。

乐观锁顾名思义就是在操作时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。

悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其先锁住,让别人用不了,我操作完成后再释放掉。

悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。

经验之谈,赞!

#1


该回复于2010-04-29 12:37:29被版主删除

#2


自己顶下

#3


该回复于2010-04-29 16:13:41被版主删除

#4


你同事写的这种方法称为乐观锁。

乐观锁顾名思义就是在操作时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。

悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其先锁住,让别人用不了,我操作完成后再释放掉。

悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。

#5


一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁。

如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。

#6


IMHO,大部分应用,乐观锁足够了

#7


我同事写的这种方法没问题吧?

#8


当然有问题了,如果money主键/唯一,怎么可以随便更新?

#9


一般常见的检查,
表里有个revision字段,
将信息呈现给客户的时候,同时记住当前revision,
更新前检查相同id的记录的revision,ok的话,更新记录的同时,revision增加

#10


楼主同事既然用这个办法,那还不如这样子

UPDATE TABLE SET MONEY = MONEY + 变化的值 WHERE ID=?

#11


引用 8 楼 shine333 的回复:
当然有问题了,如果money主键/唯一,怎么可以随便更新?


这个是什么意思?你的意思说如果money是主键就不行?

#12


乐观锁,悲观锁 很大程度上由 冲突的频率决定

冲突几率大用悲观 ,小就用乐观

#13


引用 4 楼 bao110908 的回复:
你同事写的这种方法称为乐观锁。

乐观锁顾名思义就是在操作时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。

悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其先锁住,让别人用不了,我操作完成后再释放掉。

悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。

经验之谈,赞!