2015-06-03 109 views
1

我有這樣的方法選擇從表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刪除行,只有截去被鎖定

+0

這個問題並不涉及到休眠。我認爲你以這種方式配置了datasorce。但這是瘋狂的猜測。 – talex

+0

你可以發佈你的HBM文件或實體類嗎? – Mihir

回答

1

您需要運行一個TRUNCATE語句之前提交事務中的代碼。 MySQL的維護元鎖,如果有從DML語句的鎖,它需要通過執行DDL語句(TRUNCATE在這種情況下)之前提交被釋放。 SELECT和DELETE是DML語句,TRUNCATE是DDL語句。因此,除非鎖定被釋放,否則您將能夠執行DELETE,但不能執行TRUNCATE。

+0

這種方法沒有明確的事務,我該如何提交? 應該開始交易並明確提交它? 'session.beginTransaction(); ' 我以爲open()和close()會話就夠了。 –

+0

如果你只是想看看它如何改變行爲,你可以嘗試設置autocommit爲true。但是,建議您明確設置事務邊界。說數據庫引擎執行事務上下文中的每個語句,即使它是一個SELECT語句,但是不同的DB處理事務以提交或回滾不同於非事務性數據訪問。 AFAIK Hibernate不會自行提交事務。所以,在這裏Hibernate打開一個JDBC事務,但實際上從來沒有關閉,雖然連接在close()之後返回到連接池。 – rockcode