关于HIBERNATE的锁

pwair 2008-03-14 11:02:53
能否明确地告诉我,在默认情况下,执行和数据库相关的操作的时候,Hibernate都会给数据库加上什么样的锁?

Session里的方法:
delete(Object object)
加的是LockMode.WRITE?

find(String query)
如果执行的是select...for update,那么给数据库加的是LockMode.UPGRADE 锁。如果执行只是普通的select语句呢?

get(Class clazz, Serializable id)
不清楚

load(Class theClass, Serializable id)
不清楚

save(Object object)
加的是LockMode.WRITE?

saveOrUpdate(Object object)
加的是LockMode.WRITE?

update(Object object)
加的是LockMode.WRITE?


Query里的方法:
executeUpdate()
加的是LockMode.WRITE?

list()
不清楚


Criteria里的方法:
list()
不清楚


SQLQuery里的方法:
executeUpdate()
加的是LockMode.WRITE?
list()
不清楚
...全文
234 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyujia 2008-03-23
  • 打赏
  • 举报
回复
建议你做断点,将程序停在有问题的地方,在数据库里面查询下那些表锁住了,一看便知.
sunyujia 2008-03-23
  • 打赏
  • 举报
回复
查询当然也可以加锁那就是你没配置正确或没使用正确,正常查询是不应该配置声明式事务或手工开事务的.
pwair 2008-03-17
  • 打赏
  • 举报
回复
补充一下:
目前出现问题是,在多线程并发执行的情况下,出现了数据库死锁的异常。
过程是:
线程1:数据库更新操作开始。
线程2:数据库查询操作开始。
线程1:数据库更新操作结束。
然后,本应该是:线程2:数据库查询操作结束。 但是,却抛出死锁异常。
如果说,查询不会加锁的话,为什么会在执行查询的时候出现死锁呢?

这个是不是说,要查询的表,被锁定了,所以查询不了?
如果是这样的话,是不是因为,更新操作给数据库加锁了,而没有释放?可是,程序更新的过程中并没有显式地给数据库加锁阿。
表如果被锁定了,查询也无法进行?
pwair 2008-03-17
  • 打赏
  • 举报
回复
目前出现问题是,在多线程并发执行的情况下,出现了数据库死锁的异常。
过程是:
线程1:数据库更新操作开始。
线程2:数据库查询操作开始。
线程1:数据库更新操作结束。
然后,本应该是:线程2:数据库查询操作结束。 但是,却抛出死锁异常。
如果说,查询不会加锁的话,为什么会在执行查询的时候出现死锁呢?

------------------------------------------------------------------------------

引用: hiernate的锁机制分:乐观锁和悲观锁.

如果没有特别指定,也就是默认情况下,是什么锁呢?
悲观锁,通过如下方式指定:
Query query=session.createQuery(sql);
query.setLockMode("对象",LockModel.UPGRADE);
乐观锁,通过程序逻辑来锁定。
但是,如果程序里既没有通过query.setLockMode("对象",LockModel.UPGRADE);来指定悲观锁,也没有通过程序逻辑来做乐观锁的控制,那么可以说没有对数据库进行锁操作么?

----------------------------------------------------------------------------
   以下一部分:
hiernate的加锁模式:
LockMode.NONE : 无锁机制。
LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动获取。
LockMode.READ : Hibernate在读取记录的时候会自动获取。

这三种加锁模式是供hibernate内部使用的,与数据库加锁无关
LockMode.UPGRADE:利用数据库的for update字句加锁。

上面说的“获取”,是从哪里获取的?是从数据库?
“这三种加锁模式是供hibernate内部使用的,与数据库加锁无关 ”的意思是说:只有在程序里明显地调用query.setLockMode("对象",LockModel.UPGRADE);才会给数据库加锁,其他情况下,并不给数据库加锁???
sunyujia 2008-03-15
  • 打赏
  • 举报
回复
楼上总结的非常好

查询的是不可能加锁的.
加油馒头 2008-03-15
  • 打赏
  • 举报
回复
hiernate的锁机制分:乐观锁和悲观锁.

   以下一部分:
hiernate的加锁模式:
LockMode.NONE : 无锁机制。
LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动获取。
LockMode.READ : Hibernate在读取记录的时候会自动获取。

这三种加锁模式是供hibernate内部使用的,与数据库加锁无关
LockMode.UPGRADE:利用数据库的for update字句加锁。

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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