记录JDBC/Hibernate/JPA事务隔离级别
我正在开发一个连接到Microsoft SQL Server数据库的Flex/BlazeDS/Spring/JPA/Hibernate web应用程序。它似乎过于激进地锁定了桌子。根据我的研究,使用快照隔离策略似乎是最好的选择 我已经把事情安排好了:记录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
<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应用服务器数据源允许您设置全局事务隔离级别,因此来自该数据源的所有连接都继承相同的隔离级别