我是一个新的Spring用户。 我对范围和交易有疑问。
例如,有一项服务:
<bean id="bankInDaoService" class="service.dao.impl.UserDaoServiceImpl">
让我们说有 2人想要同时进行银行存款。 而且我已经将 @Transactional 上面的Hibernate事务用于银行存入的方法。
我的问题是:
我真的很感谢你的帮助。
答案 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注释。如果在用户表中成功插入并在公司表中失败,则将回滚用户表记录。
希望这会对你有所帮助。欢呼声。