Не существует определенного решения проблем параллелизма в Grails (2.3.7). Я перепробовал все рекомендации, но когда я нажимаю количество одновременных потоков, следующий фрагмент кода неизменно терпит неудачу:«Grails» Row был обновлен или удален другой транзакцией (или неверное отображение неверно) «
package simpledb
import grails.transaction.Transactional
import groovy.transform.Synchronized
import org.apache.commons.logging.LogFactory
@Transactional
class OwnerService {
private static final myLock1 = new Object()
private static final myLock2 = new Object()
@Synchronized('myLock1')
static public saveOwner(def ownerName) {
def ownerInstance = null
Owner.withNewTransaction {
ownerInstance = Owner.findOrCreateByName(ownerName)
ownerInstance.save(failOnError: true, flush: true)
}
ownerInstance
}
@Synchronized('myLock2')
static public associateDog(def ownerId, def dogId) {
def lockedOwnerInstance
Owner.withNewTransaction {
lockedOwnerInstance = Owner.lock(ownerId)
def lockedDogInstance = Dog.lock(dogId)
lockedOwnerInstance.addToDogs(lockedDogInstance)
lockedOwnerInstance.save(failOnError: true, flush: true)
}
lockedOwnerInstance
}
}
Это не будет работать на линии «DEF lockedDogInstance = Dog.lock (dogId)»:
Error 500: Internal Server Error
URI
/simpledb/JsonSlurper/api
Class
org.hibernate.StaleObjectStateException
Message
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [simpledb.Dog#111]
выше конструкция очень проста, где есть много-ко-многим отношения между владельцем и собакой:
Dog Класс:
package simpledb
class Dog {
String name
Breed breed = null
Integer age = null
static hasMany = [owners: Owner]
static belongsTo = Owner
static mapping = { owners lazy: false }
static constraints = {
name blank: false, nullable: false, unique: true
breed nullable: true
age nullable: true
}
}
Владелец Класс:
package simpledb
class Owner {
String name;
static hasMany = [dogs: Dog]
static mapping = { dogs lazy: false }
static constraints = {
}
}
FYI - это БД MySQL.
Любые рекомендации?
Спасибо @ Emmanuel-Rosa за ваш ответ. Я внес изменения, которые вы рекомендовали (это то, с чего я начал). Однако я продолжаю получать такое же сообщение об ошибке, как указано выше. На этот раз несколько потоков не срабатывают при этой ошибке по сравнению с случайным потоком из моего вышеперечисленного кода. Как-то, когда дело доходит до одновременных модификаций БД, Grails не работает, как задокументировано. –
Что это за приложение, которое позволяет нескольким потокам пытаться обновить одну и ту же модель домена? –
Приложение по существу принимает запросы REST с полезной нагрузкой JSON и сохраняет их в базе данных. Однако перед созданием записи нам нужно проверить, существуют ли данные, и в этом случае данные необходимо обновить. Я использую JMeter для проверки кода, поскольку он позволяет имитировать многопоточные вызовы. –