Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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
Mysql 休眠事务和';用于更新';_Mysql_Hibernate_Transactions_Locking - Fatal编程技术网

Mysql 休眠事务和';用于更新';

Mysql 休眠事务和';用于更新';,mysql,hibernate,transactions,locking,Mysql,Hibernate,Transactions,Locking,我试图使用“for update”语句获得mysql数据库中某些行的锁。为此,我在Hibernate事务的中间创建一个标准并设置一个锁。 crit = session.createCriteria(AppIosVersion.class) .add(Restrictions.eq("version", version)) .setLockMode(LockMode.PESSIMISTIC_WRITE); 使用setLockMode

我试图使用“for update”语句获得mysql数据库中某些行的锁。为此,我在Hibernate事务的中间创建一个标准并设置一个锁。

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
问题是for update语句不允许获取锁,因为hibernate beginTransaction()在mysql中没有成为启动事务

我的hibernate配置如下(我没有使用Spring)

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/Versions?autoReconnect=true
名称
密码
org.hibernate.context.internal.ThreadLocalSessionContext
假的
org.hibernate.connection.C3P0ConnectionProvider
100
10
2.
180
0
600
真的
180
org.hibernate.dialogue.mysqldialogue

如果不使用Spring等容器提供的声明性事务管理,则必须显式处理事务

一个简单的方法是实现一个类似Spring的功能


顺便说一句,请小心使用“选择xxx进行更新”之类的语句,确保正确释放锁,并且没有其他事务会触及锁定的行。

这篇文章中的问题基本相同:
 <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>