Java Hibernate:使用select锁定表?
我有一种从表product\u customer中选择行的方法:Java Hibernate:使用select锁定表?,java,hibernate,locks,Java,Hibernate,Locks,我有一种从表product\u customer中选择行的方法: public static String getQuoziente(String pcCustomer, String pcAccountNumber, String prodCode) { String quoziente=null; Session session = HibernateUtil.getSessionFactory().openSession(); try { Stri
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;
但是truncate被锁阻止,永远不会结束。
为什么简单的select行应该锁定表
PS:我可以使用delete删除行,只有truncate被锁定在运行truncate语句之前,您需要在代码中提交事务。 MySQL维护元数据锁,如果有来自DML语句的锁,则需要在执行DDL语句(在本例中为TRUNCATE)之前通过commit将其释放。
SELECT和DELETE是DML语句,TRUNCATE是DDL语句。因此,除非释放锁,否则您将能够执行DELETE而不是TRUNCATE。这个问题与Hibernate无关。我想你是这样配置的。但这只是猜测。你能发布你的HBM文件或实体类吗?在这个方法中没有显式的事务,我如何提交它?是否应该开始事务并显式提交<代码>会话。beginTransaction()代码>我认为open()和close()会话就足够了。如果您只是想看看它如何改变行为,可以尝试将autocommit设置为true。但是,建议明确设置事务边界。也就是说,数据库引擎在事务上下文下执行每个语句,即使它是SELECT语句,但对于非事务性数据访问,不同的DBs处理事务以提交或回滚的方式不同。AFAIK Hibernate不会自行提交事务。所以,这里Hibernate打开了一个JDBC事务,但实际上从未关闭,尽管在close()之后连接会返回到连接池。