apache / apache/grails-core

Gorm SaveOrUpdateEvent firing multiple times

Open
#14,646 2 comments 0 reactions 0 assignees View on GitHub
relates-to: gorm
Dominant language
Groovy
Stars
2.9k
Forks
975
Avg merge
1d 22h
Merged PRs (30d)
92

Description

When listening for the saveOrUpdate gorm event it is getting emitted every time a transaction context is committed even if a single update or save actually happened. This is happening on [this line](https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/support/TransactionTemplate.java#L150) of TransactionTemplate `this.transactionManager.commit(status);`

I am unsure if this is intentional or if there is a way to stop this, but if any listener needs to process downstream work upon saving data to the database and wants to do it in a reactive async manner, this becomes problematic and could lead to data integrity or business flow problems.

You can see the gorm saveOrUpdate event emitted many times in [this project](https://github.com/Grails-Plugin-Consortium/grails-gorm-events) running the following curl command:

`curl -X PUT -H "Content-Type: application/json" -H "Cache-Control: no-cache" -H "Postman-Token: 7e9807e3-7df4-f6a3-a04c-1219e00ac546" -d '{"name":"Graeme2"}' "http://localhost:8080/persons/1"`

When calling the command the console will log the following:

```
INFO grails.app.services.grails.gorm.events.PersonService - GOT ValidationEvent org.grails.datastore.mapping.engine.event.ValidationEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT SaveOrUpdateEvent org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT SaveOrUpdateEvent org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT SaveOrUpdateEvent org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT ValidationEvent org.grails.datastore.mapping.engine.event.ValidationEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT PreUpdateEvent org.grails.datastore.mapping.engine.event.PreUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT PostUpdateEvent org.grails.datastore.mapping.engine.event.PostUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT SaveOrUpdateEvent org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT SaveOrUpdateEvent org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
INFO grails.app.services.grails.gorm.events.PersonService - GOT SaveOrUpdateEvent org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent[source=org.grails.orm.hibernate.HibernateDatastore@3ccc4ca0]
```

Contributor guide

Open the contributing guide

Research direction

Start at spring-tx/src/main/java/org/springframework/transaction/support/TransactionTemplate.java line 150 and reproduce the event sequence with the linked grails-gorm-events project and curl request. Trace the transaction commit path and SaveOrUpdateEvent emissions; done means a single save or update does not produce unintended repeated events while transaction behavior remains correct.

Written by the indexing model from the issue text.

Assessment

Tech stack
groovy, spring
Domain
backend, database
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.