Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:使用select锁定表?_Java_Hibernate_Locks - Fatal编程技术网

Java Hibernate:使用select锁定表?

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

我有一种从表product\u 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; 
但是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()之后连接会返回到连接池。