我试图理解事物是如何运作的。我分开理解它们,但无法了解全貌。
在较低的级别,使用SQL查询在数据库内部执行:
start transaction
insert A
insert B
commit
在更高的级别上,有Hibernate或任何其他JPA提供程序。事情需要手动管理(我没有放置try/catch/roolback以使事情更易于阅读):
public saveAandB()
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.save(A);
session.save(B);
session.getTransaction().commit();
session.close();
最后,在更高的层次上,有Spring交易:
@Transactional
public void save(A,B) {
saveA(A);
saveB(B);
}
好的,我现在正在努力理解它们之间的联系:
>
使用@Transactional,Spring在我的服务开始时创建一个事务(使用从业务服务创建的代理)。
使用Hibernate,我不再需要创建新的会话对象。我需要使用getSession()
而不是openSession()
我可以有单独的saveA()和saveB()方法,它们将在同一事务中执行(因为getSession()
将返回相同的会话)
我不需要管理session.getTransaction()。commit();在Hibernate层中。当我完成saveA()方法时,我进入以< code>getSession()开头的saveB()方法。我从saveA()方法中得到完全相同的会话。当我的save(A,B)方法完成时,我的事务被提交,从而终止会话。
这是正确的吗?
或多或少,是的。但请注意,JDBC 默认使用事务,即每个语句都在事务中运行,因此不需要显式的“启动事务”调用。