繁体   English   中英

JPA事务不回滚

[英]JPA Transaction not rolling back

我正在尝试进行如下的小样本更新:

@RestController
@RequestMapping("/customer")
public class CustomerController {

@Autowired
private EntityManager eManager;

@RequestMapping(value = "/updatepincode/pincode/{pincode}", method = RequestMethod.GET)
//@Transactional
public String updateAddress(@PathVariable("pincode") String pinCode) {
    try {
        eManager.getTransaction().begin();
        Query query = eManager.createQuery("UPDATE Addresses SET pincode = :pincode WHERE addressid = :addressid");
        int updateCount = query.setParameter("pincode", pinCode).setParameter("addressid", "714D9F99-E19E-4595-9C5A-3560C42B1389").executeUpdate();
        eManager.getTransaction().commit();
        if (updateCount > 0) {
            System.out.println("Number of records updated = " + updateCount);
        }
    } catch (Exception ex) {
        eManager.getTransaction().rollback();
        LogService.error(this.getClass().getName(), ex);
        return "Failed to update";
    }
    return "Record Updated";
 }
}

我故意进行了此更新,以查看尝试使用现有主键更新另一行时引发了哪些异常。 如预期的那样,它抛出javax.persistence.PersistenceException原因为com.microsoft.sqlserver.jdbc.SQLServerException 但是出现此错误后,我无法再打开表。 我敢肯定,这是因为交易没有回滚。 但是正如您所看到的,我的catch块中有eManager.getTransaction().rollback() 我只能在服务停止后才能打开表格。

为什么不回滚?

还尝试了@Transactional注释,但没有用。

注意 :我使用SQLServer2008。其他类型的查询也可以正常工作。 如果没有约束冲突,更新也可以正常进行。

这是我们在JPA中回滚的方式还是有其他方法?

我这样做是因为在Hibernate中,我做了类似( catch block)的操作;

if(transaction.wasCommited(){
   transaction.rollback();
}

我不知道您从何处获得此代码,但不应正确运行。 考虑重写它,并可能使用JTA进行事务管理。

@Resource public UserTransaction utx;
@Resource public EntityManagerFactory factory;

public String updateAddress(@PathVariable("pincode") String pinCode) {
    EntityManager em = factory.createEntityManager();
    try {
        Query query = em.createQuery("UPDATE Addresses SET pincode = :pincode WHERE addressid = :addressid");
        int updateCount = query.setParameter("pincode", pinCode).setParameter("addressid", "714D9F99-E19E-4595-9C5A-3560C42B1389").executeUpdate();
        utx.commit();
        if (updateCount > 0) {
            System.out.println("Number of records updated = " + updateCount);
        }
    catch (RuntimeException e) {
        if (utx != null) utx.rollback();
        LogService.error(this.getClass().getName(), ex);
            return "Failed to update";
    }
    finally {
        em.close();
    }
     return "Record Updated";
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM