悲观锁乐观锁及hibernate对它们的支持

首先高并发的情况下是要考虑锁的.如果不锁的话会引起更新丢失的.

数据库中的悲观锁:

数据库中的锁悲观锁,一上来查询的时候就把那条记录锁住
select * from t_table_id where table_name='t_client' for update;这样就可以对这个记录进行修改等,悲观锁是采用数据库机制实现的,数据被锁住之后其他用户将无法查看,直
到锁释放,只有提交或回滚事务锁才会释放。for update 语句只能放到select 语句中,因为查询时把数据锁住才有意义,只有当事务提交或回滚事务时才会释放锁.这个锁不单是oracle中有的,其他数据库中也是有的.

hibernate中如何支持悲观锁:

当你用load方法查询的时候用他的另外一种的重载方法:

Inventory inv = (Inventory)session.load(Inventory.class, "1001", LockMode.UPGRADE);//当这样的时候lazy是会失效的,因为他要锁嘛,要跟数据库打交道


乐观锁:

悲观锁的并发性不好,你一上来就锁住,其他人就在等了,乐观锁其实他不是锁,他是冲突的检索手段,他通常在数据库表里面加个字段,叫做版本.旧版本不能修改新版本,他更新的时候他会先去检索那个版本字段是多少,如果不一致的话是不予更新的.

version字段在hibernate如何进行配置,hibernate它默认就是支持乐观锁的所以class中的那个属性optimistic-lock="version"不用配置,class里面用version标签进行配置.
CVS实际上用的就是乐观锁

当他更新的时候数据库语句是怎么样的呢?它实际上是多加了一个查询的条件,

 update t_inventory set version=?, itemName=?, quantity=? where itemNo=? and version=?

如果更新的时候自己先查询出来的现在的版本跟数据库中的的版本不一致就会出错的,更新不进去抛出:org.hibernate.StaleObjectStateException:异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjsuge

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值