gpt4 book ai didi

mysql - tomcat、mysql 和 eclipselink 的 Spring 事务问题

转载 作者:行者123 更新时间:2023-11-28 23:51:44 26 4
gpt4 key购买 nike

在使用 eclipselink、tomcat 和 mysql 搜索 spring 事务后,我有很多困惑。请考虑以下问题并就此主题指导我。

  1. 我可以在 eclipseLink、tomcat 和 mysql 环境中运行 spring 事务吗?如果是这样配置如何?我使用了以下配置,但总是出现锁定异常。

持久性.xml:

<persistence-unit name="xxxxService" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>...</class>
<class>...</class>
<class>...</class>
<properties> .... </properties>
</persistence-unit>

Spring-beans.xml:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />

<bean class="org.springframework.orm.jpa.JpaTransactionManager"
id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="jpaDialect" ref="jpaDialect" />
</bean>
<bean id="jpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform" />
</bean>
<bean
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"
id="entityManagerFactory">
<property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
<property name="jpaDialect" ref="jpaDialect" />
<property name="persistenceUnitName" value="xxxxService" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

JAVA类:

  @Transactional
public void saveSumthg(Sumthg sumthg) throws Exception{
someDAO.saveSumthg(sumthg);
}

@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public List<Sumthg> findActiveSumthgs(String username) {
List<Sumthg> sumthgs = someDAO.findActiveSumthgs(username);
return sumthgs ;
}

我是不是做错了什么?我不确定 spring 事务处理是否可以与 tomcat 一起正常工作,因为我没有使用 JTA 事务。

  1. 使用 EclipseLInk 和 mysql,Id 生成策略与序列表一起使用,并且在表中只有一行为所有事务更新。我怀疑这会导致锁定问题。我对么?如果是这样,我该如何避免这种情况?

Domain 类中的 ID 生成配置如下:

@Id
@Column(name = "some_id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

在 mysql schema 中,创建了一个名为 SEQUENCE 的新表,并在其中存储了一个值。每次插入一行时,我认为 id 都是从这里获取的。由于读取和更新了相同的值,我怀疑这会导致锁定问题。如果我是正确的,我怎样才能避免这个问题??

期待您的回答。

谢谢。

得到更新 - 我可以看到以下是日志:

Internal Exception: java.sql.SQLException: Lock wait timeout exceeded; try restarting
transaction
Error Code: 1205
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [50, SEQ_GEN]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT =
SEQ_COUNT + ? WHERE SEQ_NAME = ?")]

所以很明显,这是因为 SEQUENCE 表中的相同值正在被多个线程修改。在这种情况下,我可以使用的最佳 ID 生成策略是什么?

最佳答案

问题是您使用的是最差的并发 ID 生成解决方案 (TABLE_SECUENCE)。在这种情况下,最好的解决方案是使用序列生成。

定序器可以更好地处理并发。

关于mysql - tomcat、mysql 和 eclipselink 的 Spring 事务问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com