【问题标题】:Strongloop loopback: Lock model instances atomicallyStrongloop loopback:原子地锁定模型实例
【发布时间】:2015-05-19 11:59:52
【问题描述】:

我正在通过 strongloop 的环回提供 REST Api。

我需要通过以下调用添加模型实例的锁定:

POST /User/{id}/tryLock

它返回一个 Lock 实例,带有一些附加信息:锁定是否成功,哪个用户锁定了对象等。

我正在使用 loopback-connector-mysql 并且我知道在同步 MySQL 中我会使用某种形式:

BEGIN TRANSACTION;
SELECT lockId FROM object WHERE id = objectId FOR UPDATE;

// This is C++ or Java or whatever:
if(lockId != NULL)
   Fatal("Object was locked")

INSERT INTO locks (objectId, userId, ...);
UPDATE object SET lockId = locks.lastInsertId WHERE id = objectId;
COMMIT;

这样的事情在环回中可能吗?我很想将它作为一个 mixin 来实现,这样我就可以将它用于选定的模型。

谢谢!

【问题讨论】:

    标签: loopbackjs


    【解决方案1】:

    要使用的东西是Remote Hooks

    User.beforeRemote( "tryLock", function( ctx, modelInstance, next) {
       //put code here    
    }
    

    有一种方法可以通过 loopback-connector-mysql 执行 SQL 语句。

    所以我的直觉是看看您是否可以将 SQL 语句写入其中(假设您的用户模式绑定到 MySQL,并且用户模式已通过 Arc 迁移到 MySQL)。

    这是连接器中可用功能的摘录 - 您必须进行一些研究以了解它如何绑定到模型以查看它是否可访问。

    MySQL.prototype.executeSQL = function(sql, params, options, callback) {
    

    【讨论】:

    • 问题是,(当我正确理解时)由于其异步性质,我还不能在环回中使用事务。
    • 我刚看到这个,会调查一下:github.com/strongloop/loopback-connector-mysql/pull/99
    • 或者,您可以将您的事务分解为多个部分,然后一次运行一个 SQL 命令 - 并在 Javascript 中评估结果。
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 2016-12-14
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多