2015-06-03 4 views
1

У меня есть этот метод, который выбирает строку из таблицы product_customer:Hibernate: блокировка стола с выбором?

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, только усечь заблокирован

+0

Этот вопрос не связан с Hibernate. Я думаю, что вы настроили такой способ. Но это дикая догадка. – talex

+0

Можете ли вы разместить свой файл HBM или класс Entity? – Mihir

ответ

1

Вам потребуется совершить транзакцию в коде, прежде чем запустить TRUNCATE заявление. MySQL поддерживает блокировки метаданных, и если есть блокировка из инструкции DML, ее необходимо освободить с помощью фиксации перед выполнением оператора DDL (в этом случае TRUNCATE). SELECT и DELETE являются операторами DML, а TRUNCATE - оператором DDL. Таким образом, вы сможете выполнить DELETE, но не TRUNCATE, если блокировка не будет выпущена.

+0

В этом методе нет явной транзакции, как я могу ее совершить? Должен начинать транзакцию и фиксировать ее явно? 'session.beginTransaction(); ' Я думал, что сеансов open() и close() было достаточно. –

+0

Вы можете попробовать установить autocommit в true, если хотите просто посмотреть, как он изменяет поведение. Но рекомендуется явно устанавливать границы транзакций. Сказано, что механизмы базы данных выполняют каждый оператор в контексте транзакции, даже если это оператор SELECT, но разные БД обрабатывают транзакции для фиксации или отката по-разному для доступа к транзакционным данным без транзакций. AFAIK Hibernate не совершает транзакцию самостоятельно. Итак, здесь Hibernate открывает транзакцию JDBC, но на самом деле никогда не закрывается, хотя соединение возвращается в пул соединений после close(). – rockcode

Смежные вопросы