Получение статуса транзакции без обратных вызовов в Ballerina - PullRequest
0 голосов
/ 07 мая 2018

В Ballerina мы можем определить, была ли транзакция успешной, с помощью предоставляемых нами функций onCommit и onAbort. Но это уводит нас от текущего метода.

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

boolean status=true;
transaction with retries = 4, oncommit = onCommitFunction, onabort = onAbortFunction {
    status = true;
    // any sql statement/s here
    var result = client->update("INSERT ....");
   match result {
            int c => {
                io:println("Inserted count: " + c);
                if (c == 0) {
                    status = false;
                    abort;
                }
            }
            error err => {
                status = false;
                retry;
            }
    }
}
// Here I want to know whether the transaction was a success or a failure
if(status) {
    // success action
} else {
    // Failed action
}

Есть ли лучший и более чистый способ узнать, была ли транзакция успешной сразу после транзакции, как указано выше?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Единственный способ получить статус транзакции Балерина - через зарегистрированную функцию обратного вызова. Зачем вам это нужно сразу после транзакции? Вы можете достичь той же функциональности в зарегистрированной функции обработчика. Неверно указывать логическую переменную, поскольку она не фиксирует сбои на этапах подготовки или фиксации / отмены.

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

transaction with retries = 4, oncommit = commitFunction, onabort = abortFunction {
    string txId = transactions:getCurrentTransactionId();
    //Store any information you need to access later using the txId - may be in a global map.
} onretry {
    //Get called before retrying
}

function commitFunction(string transactionid) {
    //Retrive the saved information using the transactionid. 
}

function abortFunction(string transactionid) {
    //Retrive the saved information using the transactionid. 
}
0 голосов
/ 08 мая 2018

Пожалуйста, проверьте, поможет ли вам следующий код!

transaction with retries = 4, oncommit = onCommitFunction, onabort = onAbortFunction {
    // any sql statement/s here
    int result = client->insert("INSERT ....") but {error => -1};
    if (result < 0) {
        retry;
    } else if (resilt == 0) {
        abort;
    } else {
        // success action
    }
}

Однако, если вы хотите, чтобы состояние транзакции было вне метода, то, я полагаю, вам потребуется логическая переменная вне указанного выше метода.

...