如何验证所有JDBC访问是否发生在活动事务上,即 java.sql.Connection.getAutoCommit()
总是返回false?
我正在使用Spring进行事务管理(@Transactional
)和Hibernate进行数据访问。
更新:会发生一些Hibernate访问,而不使用@Transactional
注释服务方法。这就是我想要通知的内容。
更新2 :代码示例
可以调用以下代码:
public ServiceImpl implements Service {
// missing @Transactional
public List<String> getSomeIds() {
return getDao().getSomeIds();
}
}
答案 0 :(得分:2)
对所有持久性方法使用PROPAGATION_REQUIRED。
答案 1 :(得分:2)
我能想到的一种方法是实现并注册一个虚拟JDBC驱动程序,作为要监视的语句之间的拦截器,并保留Connection#setAutoCommit()和Connection#commit()时的日志。打电话来了解交易的界限。
答案 2 :(得分:1)
你实际上不应该这样做,因为根据the @Transactional documentation,第9.5.6.1节:
默认的@Transactional设置为:
The propagation setting is PROPAGATION_REQUIRED ....
支持当前事务,如果不存在则创建一个新事务。
编辑:你最好的选择可能就是@duffymo在评论中说的话:
如果您愿意,可以编写一个方面以明确禁止在服务层之外进行DAO访问。