问题标签 [spring-transactions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2486 浏览

java - @Transactional 注释导致实体上的返回类型不兼容错误

我有一个在 Spring MVC 中开发的 Restful Web 服务,它当前返回农民信息,并允许在数据库中删除和添加新农民。在扩展 Web 服务以包含农民顾问时,只要将事务注释添加到顾问 DAO 实现,我就会收到以下错误:

关于这个错误的奇怪部分是,在将注释添加到类之前,系统编译得很好并且符合预期,但是因为我需要能够将实体持久化到数据库中,所以需要事务。我知道错误的含义,但我不知道为什么这只是使用注释时的问题,甚至没有应用于编译器抱怨的方法。

顾问 DAO 界面:

接口实现:

使用的上下文文件:

0 投票
2 回答
5974 浏览

spring - Spring 的 PlatformTransactionManager 是否需要按特定顺序提交事务?

我正在寻找改造我们现有的事务 API 以使用 Spring 的PlatformTransactionManager,这样 Spring 将管理我们的事务。我将我DataSource的 s 链接如下:

DataSourceTransactionManager- > LazyConnectionDataSourceProxy- > dbcp.PoolingDataSource- >OracleDataSource

在试验中DataSourceTransactionManager,我发现在使用 PROPAGATION_REQUIRES_NEW 的地方,似乎 Spring 的事务管理要求事务以LIFO方式提交/回滚,即您必须首先提交/回滚最近创建的事务。

例子:

遗憾的是,这与我们当前的事务 API 完全不匹配,后者允许您创建由 Java 对象表示的事务,并以任何顺序提交它们。

我的问题:我是否认为这种 LIFO 行为是 Spring 事务管理的基础(即使对于完全独立的事务)?或者有没有办法调整它的行为以使上述测试通过?

我知道正确的方法是使用注解、AOP 等,但目前我们的代码不是 Spring 管理的,所以它不是我们真正的选择。

谢谢!

0 投票
1 回答
2671 浏览

grails - 只读模式下不允许写操作(FlushMode.MANUAL):

圣杯 1.3.7

我们有一个合并 2 个用户的服务方法。由于数据量很大,因此有很多部分,因此需要进行大量读取,更新和写入。我们在服务中有 transactional=true。我知道 Grails 的默认 FlushMode 是 AUTO。而且我了解该错误消息的含义。

但是,它不会在本地发生,也不会在我们的暂存环境中发生。所有这些都以相同的权限运行相同版本的 MySQL(密码除外)。

我知道我可以更改默认的 FlushMode 行为,但我很犹豫,因为我无法在生产环境之外的任何环境中复制该行为。现在我只是想知道是否有任何可能导致这种情况实际上与 FlushMode 无关的东西?

逐字错误消息是:

org.springframework.dao.InvalidDataAccessApiUsageException:只读模式下不允许写入操作(FlushMode.MANUAL):将您的 Session 转换为 FlushMode.COMMIT/AUTO 或从事务定义中删除“readOnly”标记。

0 投票
2 回答
451 浏览

java - 在事务下执行只读查询是否有性能损失?

使用基于 Spring AOP 的声明性事务管理将所有方法定义为事务性是否有任何性能损失?请参阅下面的配置。原因是我不知道开发人员会给非事务性方法取什么方法名。一种选择是我从通配符列表开始,如果方法名称不属于定义的列表,开发人员会更新列表。

0 投票
2 回答
1339 浏览

nhibernate - 在 Spring.Net 中使用 Transaction 属性时如何覆盖默认隔离级别

在方法上使用 Transaction() 属性时,默认隔离级别为 ReadCommitted。我要做的是在 Spring.NET 配置中将默认隔离级别设置为 ReadUncommitted (以免修改当前存在的所有 Transaction 属性定义)

我该怎么做 ?可以用 Spring.NET 1.2 完成吗?

我尝试使用 tx:advice 等遵循文档但无济于事。

我什至已经使用 Reflector 进入了 Spring 的代码,但我似乎从中了解到,Spring 只是从方法的 Attribute 声明中读取设置。

可以完成还是我必须通过代码并在必要时修改属性?

0 投票
2 回答
2514 浏览

java - 在衍生的线程中进行事务处理

我在现有系统上工作,需要让我的 spring 事务管理器附加到从主作业线程产生的线程。我不断收到这个异常

我用事务注释注释了我能想到的所有内容,但我仍然无法清除此错误。

我错过了什么

我的方法

0 投票
2 回答
636 浏览

spring - 使用 Spring AOP 和 @Transactional 时如何编写有用的单元/集成测试?

我有一个围绕特定服务定义的日志记录方面。我正在使用 Spring AOP 并建议使用一些服务方法来记录与这些方法调用相关的特定应用程序事件。

例如,我使用 @AfterThrowing 注释来检测方法调用中的失败,以便我可以相应地记录。我的服务方法被标记为@Transactional。

正如您可能知道的那样,在提交事务后调用日志记录方面逻辑非常重要,否则我的日志记录方面将错过与提交失败的事务相关的任何错误。更糟糕的是,任何与成功的方法调用相关的日志消息都将被写入,即使该方法在事务提交后实际上失败了。

通过确保我正确定义了方面顺序优先级,我可以完美地工作。我最大的问题是我希望能够编写一个测试(集成测试似乎是唯一的选择),它将断然确认订单优先级得到尊重。鉴于顺序优先级是一种配置,很容易预见将来会有人出现并调整配置而没有意识到他们正在破坏关键代码。

所以,我的理论是我需要编写一个测试,故意导致事务在提交时失败,然后检查我的日志记录中的逻辑 @AfterThrowing 切入点是否在之后被调用。

以前有人遇到过这种需求吗?我确信这是使用 AOP 时的常见场景。

0 投票
2 回答
5320 浏览

mysql - Spring @Transactional Deadlock

I have the following setup.

  • Spring 3.0.5
  • Hibernate 3.5.6
  • MySql 5.1

To save a record in the DB via Hibernate I have the following workflow

  1. send JSON {id:1,name:"test",children:[...]} to Spring MVC App and use Jackson to transform it into an object graph (if it is an existing instance the JSON has the proper ID of the record in the DB set

  2. save the object in DB via service layer call (details below)

    • the save function of service layer interface SomeObjectService has the @Transactional annotation on it with readOnly=false and Propagation REQUIRED

    • the implementation of this service layer SomeObjectServieImpl calls the DAO save method

    • the DAO saves the new data via a call of hibernate's merge e.g. hibernateTempate().merge(someObj)

    • hibernate merge loads the object first from the DB via SELECT

    • I have a EntityListener who is wired to spring (I used this technique Spring + EntityManagerFactory +Hibernate Listeners + Injection) and listens to @PostLoad

    • The listener uses a LockingServie to updates one field of someObject to set it as locked (this should actually only happen when someObject is loaded via Hibernate HQL,SQL or Criteria calls but gets called also on merge)

    • the LockingServie has a function lock(someObj,userId) which is also annotated with @Transactional with readOnly=false and REQUIRED

    • the update happens via a call of Query query = sess.createQuery("update someObj set lockedBy=:userId"); and then query.executeUpdate();

    • after merge has loaded the data it start with updating someObject and inserting relevant children (<= exacely here is the point where the deadlock happens)

  3. return JSON result (this also includes the newly created object ID) back to client.

The problem seems for me that first

  1. the record gets loaded in a transaction
  2. then gets changed in another (inner-)transaction
  3. and then should get updated again with the data of the outer transaction but can't get updated because it is locked.

I can see via MySQL's

that a child table (that is part of the object graph) is locked.

Interesting fact is that the deadlock doesn't occur on the someObj table but rather on a table that represents a child.

I am a bit lost here. Any help is more than welcome.

BTW can maybe the isolation level get me out of this problem here?

0 投票
2 回答
119 浏览

java - 如何使用 sql 事务?

我有一个带有支持事务的 ndbcluster 引擎的 Mysql 服务器。

我想在带有 Spring JDBC 框架 3.0.6 的 tomcat 6 下对我的 Java 应用程序使用事务。

我在 web.xml 中配置了一个名为 idDataSource 的 DataSource bean。

我添加了以下内容:

创建 txManager bean。

我在以下网址阅读了文档:http: //static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

不幸的是,我真的很迷茫。我知道我可能需要实现某种事务接口,但我不知道是哪个。任何信息将不胜感激!!!

谢谢你

0 投票
1 回答
10563 浏览

spring - MyBatis-Spring 设置不使用事务

我有一个使用 MyBatis 和 Spring 设置的 Web 应用程序,但它似乎没有使用任何事务。这是配置:

应用程序上下文.xml:

带有事务定义的示例 bean 方法:

测试道:

服务器调试日志:

由于secondDelete()抛出异常,整个事务将被预期回滚。但是,事实并非如此,并且firstDelete()仍然承诺。我已经尝试了事务管理器配置的所有组合(Spring 管理,应用服务器管理,两者),但我一直得到相同的结果。知道我做错了什么吗?

我在 WebSphere 7 上使用 Mybatis 3、Spring 3 和 SQL Server 2005 作为数据库。