在下面的代码中,当我调用方法EntityADAO.findByGroupId(...)时,表EntityA将被锁定,直到事务完成。我不想要这个。如何避免表锁定?提前谢谢。
My database is SQL SERVER 2012. I am suing Hibernate 4.0.2.
以下是代码摘录:
@Entity
@Table(name = EntityA)
@NamedQueries ({
@NamedQuery(name="EntityA.findByGroupId", query="SELECT p FROM EntityA p WHERE p.groupId= :groupId")})
public class EntityA implements Serializable {
@Id
@Column(name = "EntityKey", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long entityKey;
@Version
@Column(name = "Version", nullable = false)
private Long version = -1l;
@NotNull
@Column(name = "GroupId")
private Integer groupId;
}
@Repository("EntityA")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class EntityADAO extends AbstractJpaDAO<EntityA> {
@PersistenceContext
protected EntityManager em;
public EntityADAO() {
setClazz(EntityADAO.class);
}
**//A call to this method locks the table EntityA until the transaction is complete**
public List<EntityA> findByGroupId(int groupId) {
TypedQuery<EntityA> query = em.createNamedQuery("EntityA.findByGroupId", EntityA.class);
query.setParameter("groupId", groupId);
return query.getResultList();
}
}
答案 0 :(得分:0)
如果我没错,SQL Server默认没有启用行版本控制,因此我认为这就是你看到这种行为的原因。
我怀疑当你发出一个选择查询时,在此查询完成之前你发出另一个更新查询,更新必须等到选择完成。
有很多方法可以解决这个问题,其中一个是enabling the row versioning。其他选项包括使用限制性最小的隔离级别。