我正在寻找一种方法来保存并立即锁定数据库上的实体,以避免其他线程在线程创建者结束之前访问实体。
我正在使用Hibernate 4.3.11和Spring 4.2.5。
提前谢谢。
答案 0 :(得分:0)
一种可能的方法是将事务级别提高到可序列化。 此级别确保数据被锁定,直到未在其他事务中使用。
答案 1 :(得分:0)
虽然有锁定模式 - LockMode.WRITE - 但正如文档所述
更新或插入对象时获取WRITE锁定。这个 锁定模式仅供内部使用,不是load()的有效模式 或lock()(如果指定了WRITE,则两者都抛出异常)..
如果您只是插入行,那么您无法使用hibernate专门锁定数据库行,因为行尚未提交。 您的代码(休眠或不休眠)在数据库中插入行但尚未提交的那一刻 - 持有的事务锁在事务提交时释放。锁的本质以及内部发生的方式是数据库特定的。但是,如果您有兴趣锁定某些行(已存在),那么您 可以使用
查询数据session.get(TestEntity.class, 1, LockMode.PESSIMISTIC_WRITE);
这将在事务持续时间内保持悲观锁定(通常通过发出SELECT .... FOR UPDATE),并且没有其他线程/事务可以修改已执行锁定的数据。
答案 2 :(得分:0)
Hibernate提供了两种类型的乐观乐观和悲观。它直截了当。
1)乐观使用版本控制,其中包含数据库中的版本列并在更新之前检查它,否则抛出异常
2)悲观是像数据库处理该行上的锁定并且在操作完成后它将被释放,有几个选项与你想象的类似读锁,写锁
https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html