我正在使用带有JavaScript后端的Azure移动服务来执行自定义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]无效的参数传递给函数query或queryRaw。
另一方面,如果我对原始mssql对象执行相同的查询(使用相同的语法),则似乎connection.commit()和connection.rollback()语句不执行任何操作。查询有效,项目确实被删除...但是即使最后一个步骤我调用connection.rollback()也会删除它们。
我希望我应该以某种方式调用connection.query并传递事务。我找不到与此有关的任何文档。
如何在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});
}
});
我发现此语法很麻烦,但可以。欢迎对此模式进行任何改进或提出建议!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句