我希望有人可以确认我对Spring服务中的交易行为的理解。
首先,我是否相信在使用TransactionManager
时,必须从@Transactional
方法中调用导致数据库持久性的所有服务,以便更新持久保存到数据库?
例如,给定以下类:
class MyService
{
CustomerImporter customerImporter
CustomerDAO customerDAO
public void updateCustomer(Customer customer)
{
customerDAO.update(customer)
}
public List<Customer> importCustomers(String url)
{
customerImporter.importCustomers(url);
}
return customerDAO.getFromURL(url);
}
如果updateCustomer
不是@Transactional
,该方法会有效吗?
此外,如果在CustomerImporter
上方法importCustomers()
标记为@Transactional
但MyService未标记,则更新是否会持久保存到数据库?
答案 0 :(得分:4)
首先,我相信是正确的 当使用TransactionManager时, 所有导致的服务 必须持久化到数据库 从@Transactional中调用 方法以便更新 坚持到db?
情况并非如此,不是。如果没有注释,数据库更新将以非事务方式完成,但它们仍将发生。
如果不是updateCustomer @Transactional,方法会有 有什么影响?
此外,如果在CustomerImporter上 方法importCustomers()被标记 @Transactional但MyService不是, 将更新持续到 数据库?
实际上,@Transactional
和DAO之间没有神奇的关联。注释定义了事务边界,每次输入或退出@Transactional
注释方法时,Spring都将启动/回滚/提交事务。
如果你执行一个@Transactional
- 带注释的方法,然后该方法调用另一个类中的另一个方法,并且另一个方法调用另一个方法,最终完成一些数据库工作,那么你仍然在事务中。注释可以在任何有意义的地方进行。例如,如果您选择,可以将@Transactional
放在MVC控制器上,它仍然有效,您只需将事务边界“向上移动”。
答案 1 :(得分:2)
是的,您是对的 - 您需要@Transactional
+ <tx:annotation-driven />
才能使交易有效。
另一种方法是在xml中使用spring的<aop:
功能。
至于你的第二个问题,它将在同一个交易中执行。请查看transaction propagation,了解如何在事务方法上定义此行为。