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

gaojava 2010-04-29 11:14:11
1。在处理并发问题上,在什么条件下选择悲观锁?在什么条件下选择乐观锁?

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

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

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

3。事务是隔离的,对于数据库来说是在一个时间点对一条记录只能有一个操作对吧?
如果是这样我想上面控制并发没问题
4。不知道各位大哥在具体项目采用什么方法来解决并发的。
谢谢
...全文
560 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
phyerbarte 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bao110908 的回复:]

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

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

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

悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。
[/Quote]
经验之谈,赞!
vgvg 2010-04-30
  • 打赏
  • 举报
回复
乐观锁,悲观锁 很大程度上由 冲突的频率决定

冲突几率大用悲观 ,小就用乐观
gaojava 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shine333 的回复:]
当然有问题了,如果money主键/唯一,怎么可以随便更新?
[/Quote]

这个是什么意思?你的意思说如果money是主键就不行?
panhaichun 2010-04-29
  • 打赏
  • 举报
回复
楼主同事既然用这个办法,那还不如这样子

UPDATE TABLE SET MONEY = MONEY + 变化的值 WHERE ID=?
shine333 2010-04-29
  • 打赏
  • 举报
回复
一般常见的检查,
表里有个revision字段,
将信息呈现给客户的时候,同时记住当前revision,
更新前检查相同id的记录的revision,ok的话,更新记录的同时,revision增加
shine333 2010-04-29
  • 打赏
  • 举报
回复
当然有问题了,如果money主键/唯一,怎么可以随便更新?
gaojava 2010-04-29
  • 打赏
  • 举报
回复
我同事写的这种方法没问题吧?
shine333 2010-04-29
  • 打赏
  • 举报
回复
IMHO,大部分应用,乐观锁足够了
  • 打赏
  • 举报
回复
一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁。

如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。
  • 打赏
  • 举报
回复
你同事写的这种方法称为乐观锁。

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

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

悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低。
gaojava 2010-04-29
  • 打赏
  • 举报
回复
自己顶下

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧