哪些数据存储在@Transactional服务中,尤其是在事务中?如果我有控制器布局,服务布局,daos和数据库 - 为什么我必须使用带有@Transactional注释的服务以及这些布局之间存储的数据? 例如,我发送一些对象数据,我希望它写入数据库。那么,在交易中会存储所有这些数据吗?但是如果我只通过给出对象的id来更新数据库中的某些数据呢? 你能帮我理解吗?
答案 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标记,这意味着任何失败都会导致整个操作回滚到其先前的状态。因此,如果其中一个更新失败,则将回滚对数据库的其他操作。