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
记录JDBC/Hibernate/JPA事务隔离级别_Hibernate_Jpa_Jdbc_Transactions_Isolation Level - Fatal编程技术网

记录JDBC/Hibernate/JPA事务隔离级别

记录JDBC/Hibernate/JPA事务隔离级别,hibernate,jpa,jdbc,transactions,isolation-level,Hibernate,Jpa,Jdbc,Transactions,Isolation Level,我正在开发一个连接到Microsoft SQL Server数据库的Flex/BlazeDS/Spring/JPA/Hibernate web应用程序。它似乎过于激进地锁定了桌子。根据我的研究,使用快照隔离策略似乎是最好的选择 我已经把事情安排好了: <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" lazy

我正在开发一个连接到Microsoft SQL Server数据库的Flex/BlazeDS/Spring/JPA/Hibernate web应用程序。它似乎过于激进地锁定了桌子。根据我的研究,使用快照隔离策略似乎是最好的选择

我已经把事情安排好了:

  <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" lazy-init="true">
    <property name="persistenceUnitName" value="OrderManagerPersistenceUnit" />
    <property name="dataSource" ref="dataSource"/>
     <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
     </property>
    <property name="jpaProperties">
      <props>
        <prop key="hibernate.jdbc.batch_size">${db.main.hibernate.jdbc.batch_size}</prop>
        <prop key="hibernate.hbm2ddl.auto">${db.main.hbm2ddl.auto}</prop>
        <prop key="hibernate.search.default.indexBase">${db.main.search.default.indexBase}</prop>
        <prop key="hibernate.search.autoregister_listeners">${db.main.search.autoregister_listeners}</prop>
          <prop key="hibernate.show_sql">${db.main.show_sql}</prop>
          <prop key="hibernate.dialect">${db.main.dialect}</prop>
          <prop key="hibernate.connection.isolation">${db.main.isolation}</prop>
          <prop key="hibernate.ejb.naming_strategy">com.herffjones.zebra.db.ZebraNamingStrategy</prop>
      </props>
    </property>
  </bean>
但是,我不确信它实际上使用的是hibernate.connection.isolation。看起来我还必须在JDBC数据源上设置一些属性

我想验证它当前是否使用4096作为查询的事务隔离级别

我可以向logback.xml文件中添加哪些包和日志级别,以清楚地看到特定查询使用的隔离级别


谢谢

我想描述一下我在JPA/MySQL上遇到的一个问题;这可能会激发你的调查

全局事务开始 事务1表地址上的新行 自动增量 事务2 a新的 表上的行具有 表地址上的外键;新的 插入的企业链接到 新地址ID。 全球交易结束 在这种情况下,使用ResourceLocal/JPATransactionManager的MYSQL死锁

实际上,我们似乎无法打开多个嵌套事务。全局事务似乎与事务1和事务2合并。事务2以死锁结束,因为数据不能与未准备好的新Id一起馈送给表

但是,我们可以通过调试器看到事务1和事务2之间的新adresse rowid

这和你的问题相似吗?你猜你的死锁和自动递增有什么关系吗? 以下是可能的解决方案

解决方案1 更改隔离级别? ->怎么会?!!我没有答案……我不是舒尔,这将改变一切

解决方案2 将JPA实体ID生成策略或自动标识替换为自定义序列表

解决方案3

检查是否无法在多通关系上使用级联策略

EntrepriseEntity{
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id_entreprise")
private int id;

@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name = "id_address")
private AddressEntity address;  
然后将两行保存到一个合并中:

EntrepriseEntity e=new EntrepriseEntity();
e.setAddress(new AddressEntity());
e=entityManager.merge(e);
返回实例,并返回插入的新ID和magic:不再死锁


解决方案3更智能,但需要更深入的分析和更改一些代码…

您应该将hibernate的事务隔离级别设置为2,即读取提交的java.sql.Connection常量

然后在没有活动连接的SQL Server 2005实例中执行以下操作:

ALTER DATABASE[数据库\u名称]设置允许\u快照\u隔离打开; ALTER DATABASE[DATABASE_name]将READ_COMMITED_快照设置为ON

通过执行此查询进行测试:

选择[名称],快照\隔离\状态\描述,快照\隔离\状态,是否已读取\已提交\快照\打开 从sys.databases 其中[name]=“数据库名称”

现在,在SQL Server中,已提交的读取将被解释为已提交的读取快照。

,Hibernate将忽略Hibernate.connection.isolation设置

您需要在数据源级别设置隔离级别。大多数连接池或XAJavaEE应用服务器数据源允许您设置全局事务隔离级别,因此来自该数据源的所有连接都继承相同的隔离级别