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