在芭蕾舞女演员,我们可以确定交易是否在我们提供的“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
}
在上述交易之后,我是否有更好更清洁的方式来了解交易是否成功?
提前致谢。
答案 0 :(得分:4)
获取Ballerina交易状态的唯一方法是通过注册的回调函数。为什么你需要在交易后才拥有它?您可以在已注册的处理程序函数中实现相同的功能。具有布尔变量是不正确的,因为它不会捕获准备或提交/中止阶段中的失败。
如果要保存某些与事务相关的信息,可以使用当前事务id,并使用该id调用回调函数。
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.
}
答案 1 :(得分:1)
请检查以下代码是否对您有所帮助!
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
}
}
但是,如果你想让事务的状态在方法之外,那么我相信你必须在上面的方法之外有一个布尔变量。