【问题标题】:Why is a truncate - insert query not rolled back?为什么截断 - 插入查询不回滚?
【发布时间】:2021-07-19 15:51:09
【问题描述】:

我正在截断表格,然后插入新数据。不知何故,我们得到了类似(数据大小更多)的错误。它给出错误但截断语句不回滚。

您能否建议问题是什么以及如何回滚?

try {

    utx.begin();
    List<Company> company = CompanyMapper.MAPPER.entityListToDaoList(query);
    logger.log(Level.INFO,"Truncating Table Company!!");
    emTarget.createNativeQuery("TRUNCATE TABLE Company").executeUpdate();
    logger.log(Level.INFO,"Table Companyrole Company!!");
    logger.log(Level.INFO,"Populating Table Company!!  - " + company.size());
    for (Company row : company) {
        logger.log(Level.INFO,"ROW:" + row.getCompanyid() 
        + "| Address:" + row.getVisitaddress1() 
        + "| Size:" + (row.getVisitaddress1()!=null? row.getVisitaddress1().length():"0"));
        
        emTarget.persist(row);
        
        
    }
    logger.log(Level.INFO,"Populated Table Company!!");
    utx.commit();
} catch (Exception e) {
        e.printStackTrace();
        utx.rollback();
        logger.log(Level.SEVERE, "Persist transaction failed. Rollback activated", e.getMessage());
        throw new PersistenceException("There was an error reading the source table");
}

我正在使用 Oracle。

【问题讨论】:

  • 你使用的是哪个数据库?

标签: java oracle hibernate jpa truncate


【解决方案1】:

正如TRUNCATE TABLE 的 Oracle 文档中所述,您无法回滚:

注意:您不能回滚 TRUNCATE TABLE 语句,也不能使用 FLASHBACK TABLE 语句来检索 已被截断的表。

如果您希望能够回滚,则需要改用DELETE(这可能比截断慢很多)。

【讨论】:

    【解决方案2】:

    尝试使用DELETE 而不是TRUNCATE

    TRUNCATE 是 DDL,而DELETE 是 DML。

    有几种数据库实现无法回滚 DDL。

    【讨论】:

    • 所以你的意思是首先将整个数据加载到对象中,然后 for 循环到所有删除?
    • 没有。您可以运行删除所有命令。在 HQL DELETE FROM enityName
    【解决方案3】:

    您无法回滚 TRUNCATE。但如果你不得不 - 使用 DELETE 代替。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多