ballerina 学习十八 事务编程
事务在分布式开发,以及微服务开发中是比较重要的
ballerina 支持 本地事务、xa 事务、分布式事务 ,但是具体的服务实现起来需要按照ballerian 的事务模型 infection agreement
基本事务使用(本地事务)
- 参考代码(数据库)
import ballerina/mysql;
import ballerina/io;
endpoint mysql:Client testDB {
    host: "localhost",
    port: 3306,
    name: "testdb",
    username: "root",
    password: "root",
    poolOptions: { maximumPoolSize: 5 }
};function main(string... args) {
    var ret = testDB->update("CREATE TABLE CUSTOMER (ID INT, NAME
                              VARCHAR(30))");
    handleUpdate(ret, "Create CUSTOMER table"); ret = testDB->update("CREATE TABLE SALARY (ID INT, MON_SALARY FLOAT)");
    handleUpdate(ret, "Create SALARY table");
    transaction with retries = 4, oncommit = onCommitFunction,
                                  onabort = onAbortFunction {
        var result = testDB->update("INSERT INTO CUSTOMER(ID,NAME)
                                     VALUES (1, 'Anne')");
        result = testDB->update("INSERT INTO SALARY (ID, MON_SALARY)
                                 VALUES (1, 2500)");
        match result {
            int c => {
                io:println("Inserted count: " + c);
                if (c == 0) {
                    abort;
                }
            }
            error err => {
                retry;
            }
        }
    } onretry {
        io:println("Retrying transaction");
    }
    ret = testDB->update("DROP TABLE CUSTOMER");
    handleUpdate(ret, "Drop table CUSTOMER"); ret = testDB->update("DROP TABLE SALARY");
    handleUpdate(ret, "Drop table SALARY");
    testDB.stop();
}
function onCommitFunction(string transactionId) {
    io:println("Transaction: " + transactionId + " committed");
}
function onAbortFunction(string transactionId) {
    io:println("Transaction: " + transactionId + " aborted");
}
function handleUpdate(int|error returned, string message) {
    match returned {
        int retInt => io:println(message + " status: " + retInt);
        error err => io:println(message + " failed: " + err.message);
    }
}
分布式事务
import ballerina/math;
import ballerina/http;
import ballerina/log;
import ballerina/transactions;
@http:ServiceConfig {
    basePath: "/"
}
service<http:Service> InitiatorService bind { port: 8080 } { @http:ResourceConfig {
        methods: ["GET"],
        path: "/"
    }
    init(endpoint conn, http:Request req) {
        http:Response res = new;
        log:printInfo("Initiating transaction...");
        transaction with oncommit = printCommit,
                         onabort = printAbort {
            log:printInfo("Started transaction: " +
                             transactions:getCurrentTransactionId());
            boolean successful = callBusinessService();
            if (successful) {
                res.statusCode = http:OK_200;
            } else {
                res.statusCode = http:INTERNAL_SERVER_ERROR_500;
                abort;
            }
        } var result = conn->respond(res);
        match result {
            error e =>
               log:printError("Could not send response back to client", err = e);
            () =>
               log:printInfo("Sent response back to client");
        }
    }
}
function printAbort(string transactionId) {
    log:printInfo("Initiated transaction: " + transactionId + " aborted");
}
function printCommit(string transactionId) {
    log:printInfo("Initiated transaction: " + transactionId + " committed");
}function callBusinessService() returns boolean {
    endpoint http:Client participantEP {
        url: "http://localhost:8889/stockquote/update"
    }; boolean successful; float price = math:randomInRange(200, 250) + math:random();
    json bizReq = { symbol: "GOOG", price: price };
    http:Request req = new;
    req.setJsonPayload(bizReq);
    var result = participantEP->post("", request = req);
    log:printInfo("Got response from bizservice");
    match result {
        http:Response res => {
            successful = (res.statusCode == http:OK_200) ? true : false;
        }
        error => successful = false;
    }
    return successful;
}
import ballerina/log;
import ballerina/io;
import ballerina/http;
import ballerina/transactions;
@http:ServiceConfig {
    basePath: "/stockquote"
}
service<http:Service> ParticipantService bind { port: 8889 } { @http:ResourceConfig {
        path: "/update"
    }
    updateStockQuote(endpoint conn, http:Request req) {
        log:printInfo("Received update stockquote request");
        http:Response res = new;
        transaction with oncommit = printParticipantCommit,
                         onabort = printParticipantAbort {
            log:printInfo("Joined transaction: " +
                           transactions:getCurrentTransactionId());
            var updateReq = untaint req.getJsonPayload();
            match updateReq {
                json updateReqJson => {
                    string msg =
                        io:sprintf("Update stock quote request received.
                                    symbol:%j, price:%j",
                                    updateReqJson.symbol,
                                    updateReqJson.price);
                    log:printInfo(msg); json jsonRes = { "message": "updating stock" };
                    res.statusCode = http:OK_200;
                    res.setJsonPayload(jsonRes);
                }
                error e => {
                    res.statusCode = http:INTERNAL_SERVER_ERROR_500;
                    res.setPayload(e.message);
                    log:printError("Payload error occurred!", err = e);
                }
            } var result = conn->respond(res);
            match result {
                error e =>
                     log:printError("Could not send response back to initiator",
                                     err = e);
                () =>
                   log:printInfo("Sent response back to initiator");
            }
        }
    }
}
function printParticipantAbort(string transactionId) {
    log:printInfo("Participated transaction: " + transactionId + " aborted");
}
function printParticipantCommit(string transactionId) {
    log:printInfo("Participated transaction: " + transactionId + " committed");
}
参考资料
https://ballerina.io/learn/by-example/transactions-distributed.html 
https://ballerina.io/learn/by-example/local-transactions.html
ballerina 学习十八 事务编程的更多相关文章
- ballerina 学习十九  安全编程
		ballerina 内部提供了几种常用的安全开发模型,token 认证(jwt) basic auth jwt 安全 参考代码 import ballerina/http; http:AuthPr ... 
- WCF学习笔记之事务编程
		WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ... 
- javaweb学习总结(三十八)——事务
		一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句 update from account set mone ... 
- Python学习札记(三十八) 面向对象编程 Object Oriented Program 9
		参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ... 
- 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)
		在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,我们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna.本文我们讨论另一种非常流行的集合基于模型与不基 ... 
- spring学习 十八 spring的声明事物
		1.编程式事务: 1.1 由程序员编程事务控制代码.commit与rollback都需要程序员决定在哪里调用,例如jdbc中conn.setAutoCimmit(false),conn.commit( ... 
- Scala学习十八——高级类型
		一.本章要点 单例类型可用于方法串接和带对象参数的方法 类型投影对所有外部类的对象都包含了其他内部类的实例 类型别名给类型指定一个短小的名称 结构类型等效于”鸭子类型“ 存在类型为泛型的通配参数提供了 ... 
- Java编程思想学习(十六)  并发编程
		线程是进程中一个任务控制流序列,由于进程的创建和销毁需要销毁大量的资源,而多个线程之间可以共享进程数据,因此多线程是并发编程的基础. 多核心CPU可以真正实现多个任务并行执行,单核心CPU程序其实不是 ... 
- Storm系列(十八)事务介绍
		功能:将多个tuple组合成为一个批次,并保障每个批次的tuple被且仅被处理一次. storm事务处理中,把一个批次的tuple的处理分为两个阶段processing和commit阶段. proce ... 
随机推荐
- InFusion错误类型分析
			1 God Class 1.1 特征 上帝类通常过多的操纵其他类的数据,从而破坏了类的封装性.上帝类从其他类中获得功能,同时增加了自身的耦合性,通常会导致自己具有规模过大和较高的复 ... 
- Java实现文件上传到服务器(FTP方式)
			Java实现文件上传到服务器(FTP方式) 1,jar包:commons-net-3.3.jar 2,实现代码: //FTP传输到数据库服务器 private boolean uploadServer ... 
- 升级 Jenkins 从 1.56 到 2.64
			今天上午小伙伴突然发现 git 的 Credential 出错了,同时页面的保存按钮也找不到.折腾了半天没有头绪,干脆升级到最新的版本吧,毕竟也很久没升级了. 从 1.x 到 2.x 有很多改动,为了 ... 
- ubuntu 18.04 64bit如何编译安装内核
			1.获取 wget http://mirrors.163.com/kernel/v4.x/linux-4.15.13.tar.gz 2.解压 tar xvf linux-4.15.13.tar.gz ... 
- Matplotlib 练习题
			1. 绘制一个二维随机漫步的图形 直接上代码: %pylab inline nsteps = 1000 draws = np.random.randint(-1,2,size=(2,nsteps)) ... 
- python 字典获取最大和最小的value
			my_dict = {, , } key_max = max(my_dict.keys(), key=(lambda k: my_dict[k])) key_min = min(my_dict.key ... 
- Strategy(策略)
			意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 适用性: 许多相关的类仅仅是行为有异.“策略”提供了一种用多个行为中的一个行为来配置 ... 
- QWebEngineView_简单例子_01
			工程名 : WebEngine01 1.WebEngine01.pro #------------------------------------------------- # # Project c ... 
- 中国铁路基于Intel架构超大规模OpenStack行业云的性能优化研究
			1. 项目简介 铁路作为一种大众化的交通工具和非常重要的货物运输方式,其业务规模庞大.覆盖全国.服务全国各族人民.铁路面向公众提供的服务业务,主要是客运和货运两大类,且每年365天.每天7*24小时连 ... 
- CentOS下安装Telnet服务
			环境:centos6.6 IP:172.18.0.190 1.查看是否安装Telnet: rpm -qa telnet-server rpm -qa xinetd 2.安装Telnet: yum ... 
