交易中存储了哪些数据?

时间:2015-05-27 18:57:57

标签: database spring transactions transactional

哪些数据存储在@Transactional服务中,尤其是在事务中?如果我有控制器布局,服务布局,daos和数据库 - 为什么我必须使用带有@Transactional注释的服务以及这些布局之间存储的数据? 例如,我发送一些对象数据,我希望它写入数据库。那么,在交易中会存储所有这些数据吗?但是如果我只通过给出对​​象的id来更新数据库中的某些数据呢? 你能帮我理解吗?

1 个答案:

答案 0 :(得分:2)

这不是关于交易中存储的数据。它是关于在一个事务中运行一些操作。

想象一下,您创建了银行系统,并且您有赚钱转账的方法。假设您要将金额从accountA转移到accountB

你可以在控制器中尝试类似的东西:

//Controller method
{
//...
accountA.setValue(accountA.getValue() - amount);
accountService.update(accountA);

accountB.setValue(accountB.getValue() + amount);
accountService.update(accountB);
}

但这种方法存在一些严重问题。即如果accountA的更新操作成功但accountB的更新失败,该怎么办?钱会消失。一个帐户丢失了它,但第二个帐户没有得到它。

这就是为什么我们应该在服务方法中的一个事务中进行这两个操作:

//This time in Controller we just call service method
accountService.transferMoney(accountA, accountB, amount)

//Service method
@Transactional
public void transferMoney(Account from, Account to, amount)
{
   from.setValue(from.getValue() - amount);
   accountRepository.update(from);

   to.setValue(to.getValue() + amount);
   accountRepository.update(to);
}

此方法使用@Transactional标记,这意味着任何失败都会导致整个操作回滚到其先前的状态。因此,如果其中一个更新失败,则将回滚对数据库的其他操作。

相关问题