2012-09-19 80 views
0

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

例如,有一个服务:

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

比方说,有2人谁希望银行在该同时。 而我已经把上面的@Transactional用于Hibernate事务处理用于存入目的的方法。

我的问题是:

  1. 由于默认春范围是单身。这两个人会分享相同的价值吗? (人1银行500,人2银行500)?
  2. @Transactional会有效吗?我的意思是让第一个人结束银行存入,然后是第二个人。

我会非常感谢您的帮助。

回答

1

你是正确的,默认情况下,Spring bean是单身人士。但是这不会成为一个问题,除非你的实现修改了每个调用的内部状态(这很奇怪 - 通常一个服务方法只能使用它给出的参数)。

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

deposit(person1_ID, 500) 

deposit(person2_ID, 750) 

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

现在转向@Transactional注释:Spring使用“问题”来实现这一行为,并再次会单独应用到每个执行线程,并且是独立的。

如果您正在寻找@Transactional执行某种排序(例如,你想PERSON2到退出沉积的确切数额PERSON1 ),那么你需要写在同时执行操作的新方法在一个@Transactional范围内的序列。

0

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

@Transactional注释中使用的情况下,你想获得全部或没有您的交易是成功的。如果任何交易失败,则其他成功的交易将被回滚。这不是为了同步。

如果你有注册页面,您需要输入10个字段和5是表用户和5是表的公司,你是从单一服务功能inseting均有记载。那时你应该使用@Transactional注解。如果插入在用户表中成功并且在公司表中失败,则用户表记录将被回滚。

希望这可以帮助你。干杯。