休眠:table 锁定 select?
Hibernate: table lock with a select?
我有这个方法 select 是 table 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 中截断 table:
TRUNCATE wla.product_customer;
但是 truncate 被锁定阻止并且永远不会结束。
为什么一个简单的 select 行应该锁定 table?
PS:我可以使用 DELETE 删除行,只有截断被锁定
您需要在 运行 TRUNCATE 语句之前在代码中提交事务。
MySQL维护元数据锁,如果有来自DML语句的锁,需要在执行DDL语句(本例为TRUNCATE)之前通过commit释放。
SELECT 和 DELETE 是 DML 语句,TRUNCATE 是 DDL 语句。因此,除非释放锁,否则您将能够执行 DELETE 但不能执行 TRUNCATE。
我有这个方法 select 是 table 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 中截断 table:
TRUNCATE wla.product_customer;
但是 truncate 被锁定阻止并且永远不会结束。 为什么一个简单的 select 行应该锁定 table?
PS:我可以使用 DELETE 删除行,只有截断被锁定
您需要在 运行 TRUNCATE 语句之前在代码中提交事务。 MySQL维护元数据锁,如果有来自DML语句的锁,需要在执行DDL语句(本例为TRUNCATE)之前通过commit释放。 SELECT 和 DELETE 是 DML 语句,TRUNCATE 是 DDL 语句。因此,除非释放锁,否则您将能够执行 DELETE 但不能执行 TRUNCATE。