【问题标题】:Transaction is not rolled back in ejb事务在 ejb 中未回滚
【发布时间】:2014-03-17 04:21:29
【问题描述】:

我不是 ejb 专家。我有一个像下面这样的服务类。我在我的服务类的某个位置保存一个文件,并在 dao 中调用一个方法来保存文件哈希码。由于某些原因,有时我的 dao 层出现异常。最近我观察到当我得到异常时,从我的服务层保存的文件没有被删除。

@Stateless
@Local
@TransactionManagement
public class ImportUpgradeServiceImpl implements ImportUpgradeService {

    @Inject
    private UpgradePackageDao upgradePackageDao;

    @Override
    public boolean savePackage() {
        //For the sake of simplicity I simplified the code here
        File file = new File("d:\\ejbtest.log");

        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        upgradePackageDao.savePackageHash(null);

        return false;
    }

}

下面是我的 DAO

public class UpgradePackageDaoImpl implements UpgradePackageDao {

    @Override
    public void savePackageHash(String hash) {

        throw new RuntimeException("cannot save");
    }

}

然后我用@TransactionManagement 注释了我的服务类。我错过了什么?还是我误解了ejb事务管理? ejb 事务管理是专为数据库事务设计的吗?

【问题讨论】:

  • 有人能解释一下吗?
  • 谁能回答我的问题?
  • 看看前两个答案here

标签: java transactions ejb-3.0


【解决方案1】:

不建议在 EJB 中与文件系统交互。以下是EJB Restrictions 的摘录,它对此进行了解释。

为什么 EJB 不能在文件系统中读写文件和目录? 为什么他们不能访问文件描述符?

不允许企业 bean 访问文件主要是因为 文件不是事务性资源。允许 EJB 访问文件 或文件系统中的目录,或使用文件描述符,将 损害组件的可分发性,并且会带来安全隐患。

由于文件不是事务性资源,回滚不会对其产生影响。

【讨论】:

  • 如果我错了,请纠正我。如果您编写自己的 FileSystemDataSource 它会成功,因为它隐藏/处理事务。
  • @Markus 是的,可以使用 FileSystemDataSource 进行回滚/提交操作,但这将是一个完全不同的事务,并且无法将它们与 EJB 事务相互关联。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2011-06-23
相关资源
最近更新 更多