2016-10-17 1 views
0

В моем проекте есть таблица под названием process_detail. Строка, вставленная в эту таблицу, как только начнется процесс cron и будет обновлена ​​в конце завершения процесса cron. Мы используем grails, которые внутренне заботятся о транзакции на уровне уровня сервиса, то есть транзакция начинается в начале метода, фиксирует, если выполнение метода успешное, откат, если есть какое-либо исключение. Здесь происходит то, что если транзакция не удалась, эта строка также откатывается назад, я не хочу, потому что это тип таблицы . Я попытался создать вложенную транзакцию и сохранить эту строку, а в конце - обновить ее, но с ошибкой блокировки.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 
} 

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

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

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

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

+0

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

+0

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

ответ

0

Сделайте someProcess @NonTransactional, а затем самостоятельно управляйте транзакционной природой. Напишите начальный файл saveProcessDetail с флешем: true, затем выполните остаток транзакции транзакции с помощью транзакции?

Или

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

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

Похоже, это может сработать. Я дам ему попробовать. – bitkot

+0

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

+0

@quindimildev, вы не нарушаете его, вы его завершите. –

 Смежные вопросы

  • Нет связанных вопросов^_^