春季交易范围

时间:2012-09-19 02:40:09

标签: spring transactions scope

我是一个新的Spring用户。 我对范围和交易有疑问。

例如,有一项服务:

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

让我们说有 2人想要同时进行银行存款。 而且我已经将 @Transactional 上面的Hibernate事务用于银行存入的方法。

我的问题是:

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

2 个答案:

答案 0 :(得分:1)

你是对的,默认情况下,Spring bean是单例。但是这不会成为问题,除非你的实现在每次调用时修改一些内部状态(这可能相当奇怪 - 通常服务方法只能使用它给出的参数)。

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

deposit(person1_ID, 500)

deposit(person2_ID, 750)

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

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

如果您正在寻找@Transactional来执行某种排序(例如,您希望person2 撤回确切数量person1 存放),那么您需要编写一个新方法,在一个@Transactional范围内按顺序执行两个操作。

答案 1 :(得分:1)

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

@Transactional注释用于您希望全部或全部交易无法成功的情况。如果任何事务失败,则将回滚其他成功事务。它不是为了同步。

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

希望这会对你有所帮助。欢呼声。