我正在截断表,然后插入新数据。不知怎么的,我们出现了类似的错误(数据中的大小更大(。它给出错误,但truncate语句不会回滚。
你能建议一下问题是什么以及如何将其回滚吗?
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。
如TRUNCATE TABLE
的Oracle文档中所述,您不能回滚:
注意:不能回滚
TRUNCATE TABLE
语句,也不能使用FLASHBACK TABLE
语句检索已被截断的表。
如果您想要回滚功能,则需要使用DELETE
(这可能比截断慢得多(。
尝试使用DELETE
而不是TRUNCATE
CCD_ 7是DDL,而CCD_。
有几种数据库实现无法回滚DDL。
您不能回滚TRUNCATE。但是,如果必须使用DELETE。