验证所有JDBC调用是否在事务中发生

时间:2009-08-05 23:05:26

标签: java hibernate spring

如何验证所有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();
     }
}

3 个答案:

答案 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
 ....

PROPAGATION_REQUIRED表示:

  

支持当前事务,如果不存在则创建一个新事务。

编辑:你最好的选择可能就是@duffymo在评论中说的话:

  

如果您愿意,可以编写一个方面以明确禁止在服务层之外进行DAO访问。