我有这个方法从表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被锁定
答案 0 :(得分:1)
在运行TRUNCATE语句之前,您需要在代码中提交事务。 MySQL维护元数据锁,如果存在来自DML语句的锁,则需要在执行DDL语句之前通过提交释放它(在本例中为TRUNCATE)。 SELECT和DELETE是DML语句,TRUNCATE是DDL语句。因此,除非锁定是释放,否则您将能够执行DELETE但不能执行TRUNCATE。