Hibernate:表锁与选择?

时间:2015-06-03 13:55:54

标签: java hibernate locks

我有这个方法从表product_customer中选择一行:

public static String getQuoziente(String pcCustomer, String pcAccountNumber, String prodCode) {
    String quoziente=null;
    Session session = HibernateUtil.getSessionFactory().openSession();

    try {
        String sql = String.format("SELECT pc_quoziente FROM product_customer " +
                "WHERE pc_customer=:cliente and pc_account_number=:numacc  and pc_prod_desc=:prod");
        quoziente = (String) session.createSQLQuery(sql)
                .setParameter("cliente", pcCustomer)
                .setParameter("numacc", pcAccountNumber)
                .setParameter("prod", prodCode)
                .uniqueResult();
    } finally {
        session.close();
    }
    return quoziente;
}

在此查询之后尝试使用以下命令从MySqlWorkbench截断表:

TRUNCATE wla.product_customer; 

但截断被锁定并且永远不会结束。 为什么一个简单的选择行会锁定表?

PS:我可以删除带有DELETE的行,只有truncate被锁定

1 个答案:

答案 0 :(得分:1)

在运行TRUNCATE语句之前,您需要在代码中提交事务。 MySQL维护元数据锁,如果存在来自DML语句的锁,则需要在执行DDL语句之前通过提交释放它(在本例中为TRUNCATE)。 SELECT和DELETE是DML语句,TRUNCATE是DDL语句。因此,除非锁定是释放,否则您将能够执行DELETE但不能执行TRUNCATE。