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

时间:2014-08-25 12:56:31

标签: javascript azure transactions azure-sql-database azure-mobile-services

我使用带有javascript后端的天蓝色移动服务来执行自定义API。

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

我发现很难找到关于此的大量文件。

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

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

                connection.beginTransaction();
                ...

我不知道该如何从那里开始。如果我然后尝试使用连接对象执行正常的删除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()作为最后一步,它们也会被删除。

我希望我应该调用connection.query并以某种方式传递事务。我找不到任何关于此的文件。

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

2 个答案:

答案 0 :(得分:3)

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

这是我最终使用的:

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});
    }
});

我发现这种语法很麻烦,但它确实有用。对这种模式的任何改进或建议都非常受欢迎!

答案 1 :(得分:1)

mssql.open函数返回node-sqlserver.open的对象;它只是用你的连接字符串管道。我们正在努力更新此文档。您可以查看node-sqlserver的github项目并查看单元测试:https://github.com/Azure/node-sqlserver

积极为此修复文档 - 抱歉给您带来了麻烦。