查询数据会导致查询表上的锁定

时间:2013-07-29 20:29:52

标签: spring spring-data-jpa

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

1 个答案:

答案 0 :(得分:0)

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

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

有很多方法可以解决这个问题,其中一个是enabling the row versioning。其他选项包括使用限制性最小的隔离级别。