2013-07-03 148 views
0

我試圖獲得我的MySQL數據庫上的一些行使用「更新」語句的鎖。爲此,我在Hibernate事務中創建一個Criteria並在其上設置一個鎖。休眠事務和'更新'

crit = session.createCriteria(AppIosVersion.class) 
       .add(Restrictions.eq("version", version)) 
       .setLockMode(LockMode.PESSIMISTIC_WRITE); 

使用setLockMode查詢被正確地發送到數據庫,這是我在mysql.log看到:

 133 Query SET autocommit=0 
      133 Query SET autocommit=1 
      133 Query SET autocommit=0 
      133 Query select this_.Version as Version1_5_0_, this_.EditTimeStamp as EditTime2_5_0_, this_.IsActive as IsActive3_5_0_ from AppAndroidVersion this_ where this_.Version='0.2' for update 
130703 16:46:03 133 Query rollback 
      133 Query SET autocommit=1 

的問題是,對於更新聲明不允許獲取鎖,因爲休眠beginTransaction()不成爲在mysql中的START TRANSACTION

我的休眠配置如下(我沒有使用Spring)。

<property name="connection.driver_class">com.mysql.jdbc.Driver</property> 


    <property name="connection.url">jdbc:mysql://localhost:3306/Versions?autoReconnect=true</property> 
    <property name="connection.username">name</property> 
    <property name="connection.password">password</property> 

    <!-- Session properties --> 
    <!-- <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> --> 
    <property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property> 

    <property name="hibernate.connection.autocommit">false</property> 

    <!-- configuration pool via c3p0--> 
    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
    <property name="hibernate.c3p0.max_size">100</property> 
    <property name="hibernate.c3p0.min_size">10</property> 
    <property name="hibernate.c3p0.acquire_increment">2</property> 
    <property name="hibernate.c3p0.idle_test_period">180</property> 
    <property name="hibernate.c3p0.max_statements">0</property> 
    <property name="hibernate.c3p0.timeout">600</property> 
    <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property> 
    <property name="hibernate.c3p0.unreturnedConnectionTimeout">180</property> 

    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
+0

這是幾乎相同的問題在這篇文章中:http://stackoverflow.com/questions/5019983/hibernate-session-begintransaction-call-and-mysql-start-transaction – ecostanzi

回答

0

如果您不使用像Spring這樣的容器提供的聲明性事務管理,則必須明確地處理事務。

一個簡單的方法就是像Spring那樣實現TransactionTemplate

順便說一句,要小心使用'select xxx for update'等語句,請確保正確釋放鎖定,並且其他事務將不會觸及鎖定的行。