目前,我正在使用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];无法提取 结果集
我刚刚读到有关Postgres事务的这个错误,但无法获得我应该用于Hibernate的内容。
答案 0 :(得分:1)
不是100%确定是否是这种情况,但在storeUsersList
方法中,您似乎正在重用已存在于实例变量userListToStore
中的现有用户集合。
这个用户集合未从事务内部初始化,因此实体最有可能被分离,因为您正在使用容器管理的事务。
在我看来,你应该在执行更新之前合并每个实体,以便持久化上下文知道它们:
for (Users singleUser : userListToStore) {
try {
getEm().merge(singleUser);
getEm().update(singleUser);
答案 1 :(得分:1)
感谢Speedy的帮助,我通过检查更多内容并阅读上面的错误消息解决了我的问题。我从单个事务中调用了很多事务,这意味着在我的情况下由于之前的事务错误而中止了因为它在DB上有写锁定。并且在您整理上一个交易之前,您的当前交易不会被保存。 以前的交易有愚蠢的错误 getEm().update(singleUser)
; 当前交易没有错误 integrationService.manangePassCodes(org,userListToStore.size());
一段代码
由于两者都属于不同的服务,但我已经注明了
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = { Throwable.class })
propagation = Propagation.REQUIRED表示它将支持当前事务,如果不存在则创建一个新事务。
所以它给了我错误25P02 - 交易中止。
参考链接1 - postgresql.org/message-id/25677724.post@talk.nabble.com
参考链接2 - postgresql.org/docs/9.4/static/errcodes-appendix.htm
参考链接3 - https://www.postgresql.org/message-id/8829.1173816732%40sss.pgh.pa.us