目前,我使用Spring 4.0.6在PostgreSQL 9.5。我打电话一个serviceClass1
到另一个serviceClass2
,却得到了异常的交易如下:
serviceClass1.class
`@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor= { Throwable.class })
public Map<String, Object> storeUsersList(Map<String, Object> mapOfParams) throws Exception {
Map<String, Object> returnMap = new HashMap<String, Object>();
if (userListToStore != null && !userListToStore.isEmpty()) {
integrationService.manangePassCodes(org,userListToStore.size());
for (Users singleUser : userListToStore) {
try {
getEm().update(singleUser);`
serviceClass2.class
@Override
@Transactional(readOnly=false,propagation=Propagation.REQUIRED
,rollbackFor{Throwable.class})
public void manangePassCodes(Organizations org,int userToRegisterCount)throws Exception{
//some Logic
在这里,我在这个地方变得异常 - getEm().update(singleUser);
例外SQL状态[25P02];错误代码[0];不能提取的ResultSet
刚才我看到有关此错误的Postgres左右交易,但没能得到我应该怎么使用Hibernate的。
不是100%肯定,如果是这样的话,但在你的storeUsersList
方法,你似乎可以重用现有的用户收集存储在一个实例变量userListToStore
。
用户的集合,因此实体是最容易被分离,因为你正在使用容器管理的事务不是从事务内部初始化。
在我看来,你执行更新之前,使持久化上下文是意识到它们的存在,你应该合并的每个实体:
for (Users singleUser : userListToStore) {
try {
getEm().merge(singleUser);
getEm().update(singleUser);
感谢您的迅速帮助,我有我的问题,通过检查更多阅读有关此错误消息above.I从单个事务调用许多交易解决,这意味着在我的情况下,由于前一个交易错误,因为它有下一个被中止在DB的写锁。和当前的交易将不会被保存,直到你理清前一个。以前的事务其中有愚蠢的错误getEm().update(singleUser)
;其中有什么不对integrationService.manangePassCodes(org,userListToStore.size());
一段代码,因为这两个当前事务属于不同的服务,但我已经与@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = { Throwable.class })
传播注释= Propagation.REQUIRED意味着它将支持当前事务,如果不存在,创建一个新的。所以,它给了我错误25P02 - 事务中止。
参考链接1 - postgresql.org/message-id/[email protected]
参考链接2 - postgresql.org/docs/9.4/static/errcodes-appendix.htm
参考链接3 - https://www.postgresql.org/message-id/8829.1173816732%40sss.pgh.pa.us