0

我是新的 Spring 用户。我有一个关于范围和交易的问题。

例如,有一个服务:

<bean id="bankInDaoService" class="service.dao.impl.UserDaoServiceImpl">

假设有2 个人想同时存入银行。而且我已经在上面为 Hibernate 交易添加了@Transactional用于银行入账的方法。

我的问题是:

  1. 由于默认的 Spring 范围是单例的。这两个人是否有相同的价值观。(第 1 个人存入 500,第 2 个人存入 500)?
  2. @Transactional 会有效吗?我的意思是让第一个人完成银行存款,然后是第二个人。

我会非常感谢你的帮助。

4

2 回答 2

2

你错误地理解了@Transactional 注解的用法。

@Transactional 注释用于您希望所有交易成功或不成功的情况。如果任何一个事务失败,那么其他成功的事务将被回滚。它不是为了同步。

如果您有注册页面,您可以在其中输入 10 个字段,5 个用于表用户,5 个用于表公司,并且您从单个服务功能插入两个记录。那时你应该使用@Transactional注解。如果在用户表中插入成功而在公司表中插入失败,则用户表记录将被回滚。

希望这对您有所帮助。干杯。

于 2012-09-19T06:00:25.750 回答
1

您是正确的,默认情况下 Spring bean 是单例。但这不会成为问题,除非您的实现在每次调用时都修改了一些内部状态(这会很奇怪 - 通常服务方法只会使用给定的参数)。

正如我刚才提到的,每个服务方法调用都有自己的参数;IE:

deposit(person1_ID, 500)

deposit(person2_ID, 750)

正如您所说的“同时”,我们可以安全地假设我们有一个多线程服务器同时处理这两个人,每个线程一个。方法参数被放置在任何给定线程的堆栈中 - 就您的服务而言,两个人的存款之间绝对没有连接/损坏的可能性。

现在转向@Transactional 注释:Spring 使用“方面”来实现此行为,这些将再次分别应用于每个执行线程,并且是独立的。

如果您正在寻找 @Transactional 来强制执行某种排序(例如,您希望 person2提取person1存款的确切金额),那么您需要编写一个新方法,在一个 @Transactional 范围内按顺序执行这两个操作。

于 2012-09-19T05:51:10.933 回答