在Azure移动服务自定义API中使用事务

Using transactions in Azure mobile service custom API

本文关键字:事务 API 自定义 Azure 移动 服务      更新时间:2023-09-26

我使用azure移动服务与javascript后端来执行自定义API。

我需要执行几个独立的sql语句(删除,更新)。我需要一个事务来确保我只在所有sql语句都成功时才提交。

我发现很难找到很多关于这方面的文档。

我从这里http://msdn.microsoft.com/en-us/library/jj554212.aspx开始,并按照指示调用connection.beginTransaction()

mssql.open({
            success: function(connection) {
                connection.beginTransaction();
                ...

我不知道我该如何从那里开始。如果我然后尝试使用连接对象执行普通的delete sql语句,我会得到以下错误:

connection.query(deleteStatement, [parameter1, ], {
                                    success: function(results)
                                    {
                                        connection.commit();
                                        response.send(statusCodes.OK, { message : '' });
                                    },
                                    error: function(err) {
                                       connection.rollback();
                                       console.log("error: " + err);
                                       response.send(statusCodes.Error, {message : err});
                                    }
                                });

错误:[msnodesql]传递给函数查询或的参数无效queryRaw .

另一方面,如果我在原始mssql对象上执行相同的查询(使用相同的语法),那么connection.commit()和connection.rollback()语句似乎什么也不做。查询工作,项目被删除…但是,即使我在最后一步调用connection.rollback(),它们也会被删除。

我想我应该拨打转接电话。查询和传入事务…在某种程度上。我找不到任何关于这个的文档。

如何在Azure移动服务中正确实现事务-自定义API (javascript后端)?谢谢!

我让它工作了。事实证明,它的语法与预期的有很大不同。我找不到任何关于这方面的文档,看起来我们在交易方面几乎是靠自己的。

这就是我最后使用的:

var mssql = request.service.mssql;
mssql.open({
    success: function(connection) {
        connection.beginTransaction( function (error)
            {
                var statement1 = 'delete ... where X = ?'
                connection.query(statement1, [parameter1, ], function(err, results)
                    {
                        if (!isBlank(err))
                        {
                            console.log("Error:" + err);
                            connection.rollback();
                            response.send(statusCodes.Error, {message : ''});
                            connection.close();
                            return;
                        }
                        var statement2 = 'delete ... where X = ?'
                        connection.query(statement2, [parameter2, ], function(err, results)
                            {
                                if (!isBlank(err))
                                {
                                    console.log("Error:" + err);
                                    connection.rollback();
                                    response.send(statusCodes.Error, {message : ''});
                                    connection.close();
                                    return;
                                }
                                else
                                {
                                    //daisy chain more statements if necessary. When the last one succeeds:
                                    connection.commit();
                                    response.send(statusCodes.OK, { message : '' });
                                    connection.close();
                                }
                            }
                    });
                }
            },
    error: function(err) {
        console.log("Error : " + err);
        response.send(statusCodes.Error, {message : err});
    }
});

我发现这个语法很麻烦,但它可以工作。任何关于此模式的改进或建议都是非常欢迎的!

Open函数返回node-sqlserver.open的对象;只是用你的连接串接通了。我们正在更新这个文档。您可以查看node-sqlserver的github项目并查看单元测试:https://github.com/Azure/node-sqlserver

正在积极地获取文档修复此问题-抱歉给您带来麻烦。