0

在下面的代码中,当我调用 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();       
    }
}
4

1 回答 1

0

如果我没记错的话,SQL Server 默认没有启用行版本控制,因此我认为这就是你看到这种行为的原因。

我怀疑当您发出选择查询时,在此查询完成之前您发出另一个更新查询,更新必须等到选择完成。

有很多方法可以解决这个问题,其中一种是启用行版本控制。其他选项包括使用限制最少的隔离级别。

于 2013-07-30T04:44:56.997 回答