单线程中的JPA乐观锁异常

时间:2018-11-23 10:39:12

标签: java jpa optimistic-locking

我正在尝试使用JPA持久性类更新基本的删除时间戳。这是代码:

And param env_url+entity_id

public void delete(Document document, EntityManager em, SessionContext ctx) throws MyException { try { ctx.getUserTransaction().begin(); DocumentDB documentDB = em.find(WDSDocument.class, document.getId()); if (documentDB != null) { em.lock(documentDB, LockModeType.WRITE); documentDB.setDeletedAt(new Timestamp(System.currentTimeMillis())); em.merge(documentDB); em.flush(); // OptimisticLockException raised here } ctx.getUserTransaction().commit(); if (log.isDebugEnabled()) log.debug("DELETED " + document.getId()); } catch (Exception e) { ctx.getUserTransaction().rollback(); throw new MyException(Utils.getError("ERR9", new String[] { "" + document.getId(), e.getMessage() }), e); } } 相同的Id文档已经存储在数据库中,我想更新一个字段。

document行引发了异常,就好像另一个用户(线程)正在尝试更新同一对象一样,但是在我的应用程序中不是这种情况。

我已经阅读了JPA中的em.flush(),并且我了解,当同一用户连续两次尝试更新对象而不先刷新/提交给数据库时,会引发该问题。

很明显,每当我尝试更新任何对象的OptimisticLockException删除时间戳时,都会发生此错误,所以我猜我的documentDB方法应该存在固有的错误,它会双重更新对象本身。到目前为止,我仍无法正确解决问题。

编辑

这是我的delete()

DocumentDB

其抽象超类为:

@Entity
@Table(name = "DOCUMENTS", schema = "WP")
public class DocumentDB extends AbstractEntity {
    private static final long serialVersionUID = -98765134L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID_DOCUMENT", nullable = false)
    private int id;

    @Column(name = "SOURCE")
    private String source = null;

    @Column(name = "CREATION_DATE")
    private Date creationDate;

    @Column(name = "TITLE")
    private String title = null;

    @Column(name = "AUTHOR")
    private String author = null;

    @Column(name = "URL")
    private String url = null;

    @Column(name = "DELETED_AT")
    private Timestamp deletedAt = null;

    @Override
    public Integer getId() {
        return id;
    }

    @Override
    public void setId(int id) {
        this.id = id;
    }


    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Timestamp getDeletedAt() {
        return deletedAt;
    }

    public void setDeletedAt(Timestamp deletedAt) {
        this.deletedAt = deletedAt;
    }
}

为了更好地理解此问题,请提供一些有关后续步骤的指南?

更新

到目前为止,我还没有找到问题的根本原因。我怀疑我的EclipseLink JPA实施在更新for循环内的实体时确实发生了奇怪的事情。

不幸的是,目前我没有足够的时间和资源进行更深入的研究,并且我使用悲观锁作为解决方法。希望将来能找到真正的问题。

0 个答案:

没有答案