Немедленная фиксация Grails для объектов в транзакции

#mysql #grails #transactions

#mysql #grails #транзакции

Вопрос:

В моем проекте есть таблица с именем process_detail . Строка вставляется в эту таблицу, как только запускается процесс cron, и обновляется в конце завершения процесса cron. Мы используем grails, который внутренне обрабатывает транзакцию на уровне метода обслуживания, т.Е. транзакция запускается при запуске метода, фиксируется, если выполнение метода выполнено успешно, откат при любом исключении. Здесь происходит то, что если транзакция завершается с ошибкой, эта строка также откатывается, чего я не хочу, потому что это тип таблицы журнала. Я попытался создать вложенную транзакцию и сохранить эту строку, а в конце обновить ее, но это не удается с исключением получения блокировки.

Я подумываю об использовании MyISAM для этой конкретной таблицы, таким образом, мне не нужно беспокоиться о транзакции, потому что MyISAM ее не поддерживает, и она будет зафиксирована немедленно, и откат невозможен. Вот псевдокод для того, чего я пытаюсь достичь.

 def someProcess(){
  //Transaction starts
  saveProcessDetail(details); //Commit this immediately, should not rollback if below code fails.
  someOtherWork;
  updateProcessDetail(details); //Commit this immediately, should
  //Transaction Ends
}
 

Псевдокод для сохранения и обновления деталей процесса;

 def saveProcessDetail(processName, processStatus){
  ProcessDetail pd = new ProcessDetail(processName, processStatus);
  pd.save();
}

def updateProcessDetail(processDetail, processStatus){
  pd.procesStatus = processStatus;
  pd.save();
}
 

Пожалуйста, посоветуйте, есть ли лучший способ сделать это в InnoDB. Ответ может быть на уровне mysql, я могу найти решение Grails самостоятельно. Дайте мне знать, если требуется какая-либо другая информация.

Комментарии:

1. Вам нужно показать saveProcessDetail() метод, чтобы мы могли что-то предложить.

2. @AdeelAnsari: Добавлено, я использовал их как метод, с таким же успехом они могут быть просто двумя строками кода, которые создают ProcessDetail объект и сохраняют его.

Ответ №1:

Сделайте SomeProcess @НетРанзакционным, затем самостоятельно управляйте транзакционным характером. Напишите начальный saveProcessDetail с помощью flush:true, затем сделайте оставшуюся часть обработки транзакционной с помощью transaction?

Или

 @NonTransactional 
def someProcess() {
    saveProcessDetail(details) // I'd still use a flush:true
    transactionalProcessWork()
}

@Transactional
def transactionalProcessWork() {
    someOtherWork()
    updateProcessDetail(details)
}
 

Комментарии:

1. Похоже, это может сработать. Я попробую.

2. Использование flush true не является хорошей практикой, потому что вы нарушаете транзакцию. Я бы попробовал без этого

3. @quindimildev, ты не нарушаешь это, ты завершаешь это.