首先高并发的情况下是要考虑锁的.如果不锁的话会引起更新丢失的.
数据库中的悲观锁:
数据库中的锁悲观锁,一上来查询的时候就把那条记录锁住
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:异常