发生异常时,已提交的记录将回滚

根据我的理解,在理想情况下,提交的记录永远不会回滚。但是对于以下代码,已提交的记录确实会回滚。我不确定这是由JTA还是由数据库完成的,当引用的父表回滚时,数据库会删除已提交的记录。

我将用下面的简单代码片段说明我的情况。我的交易方法createItems(List<items> items)将通过调用itemService.saveParent(items)创建父项列表。这样做flush(),然后prepareChild(parentItems)将为每个父项创建数千个子项,其中子项会将父项的主键设置为其外键。现在,我通过制作大块来调用saveChild(subList)(因为我不想通过单个事务提交一百万条记录),并且它的事务属性为REQUIRES_NEW,它将把每个子列表提交给DB。但是其中一个例外。当我检查数据库时,我看到所有插入的子记录都回滚了。对于已提交的记录,这是怎么发生的?

如果不会发生回滚,那么当父记录已经回滚并且不存在PK时,子记录又如何存在?

@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class Job {

    @EJB
    private ItemService itemService;

    public void createItems(List<items> items) {

        List<Parent> parentItems = itemService.saveParent(items);

        List<Child> childItems = itemService.prepareChild(parentItems);

        for(List<Child> subList: getSublist(childItems )) {
            itemService.saveChild(subList);
        }

    }
}


@LocalBean
@Stateless
public class ItemService {

    @EJB
    private ItemDLService itemDLService;

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void saveChild(List<child> childList) {

        itemDLService.save(childList);

    }
}
zhaoyp2222 回答:发生异常时,已提交的记录将回滚

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2946256.html

大家都在问