小编Str*_*rix的帖子

Node.js + SQLite 异步事务

我正在使用node-sqlite3,但我确信这个问题也出现在另一个数据库库中。我在混合事务和异步代码的代码中发现了一个错误。

function insertData(arrayWithData, callback) {
    // start a transaction
    db.run("BEGIN", function() {
        // do multiple inserts
        slide.asyncMap(
            arrayWithData,
            function(cb) {
                db.run("INSERT ...", cb);
            },
            function() {
                // all done
                db.run("COMMIT");
            }
        );
    });
}

// some other insert
setInterval(
    function() { db.run("INSERT ...", cb); },
    100
);
Run Code Online (Sandbox Code Playgroud)

您还可以运行完整的示例

问题是,在or之后的异步暂停期间,可以启动带有insert或查询的其他一些代码。然后这个额外的查询在事务中运行。当事务提交时这不是问题。但是,如果事务回滚,则此额外查询所做的更改也会回滚。哎呀,我们刚刚意外地丢失了数据,但没有任何错误消息。updatebegininsert

我考虑过这个问题,我认为一个解决方案是创建一个包装类,以确保:

  • 同一时间只有一项事务正在运行。
  • 当事务运行时,仅执行属于该事务的查询。
  • 所有额外的查询都会在当前事务完成后排队并执行。
  • 当事务已在运行时启动事务的所有尝试也将排队。

但这听起来像是太复杂的解决方案。有更好的方法吗?你如何处理这个问题?

sqlite asynchronous transactions node.js

5
推荐指数
1
解决办法
9789
查看次数

如何遵循鲍勃叔叔的规则(建议)在一种方法中正确使用一个 try-catch 块?

例如我有一个方法

\n
void process(String userId) {\n  if(userId == null) throw new IlligalArgumentException("User ID is required");\n\n  User user = userService.findUserById(userId);\n\n  if(user == null) throw new UserNotFoundException("User with ID: "+ userId +" not found");\n  \n  try {\n    DataResponse response = analyticsAPI.loadAnalytics(userId, user.getDob(), user.getFirstName());  \n\n    //logic\n  } catch(AnalyticsAPIException e) {\n     //logic\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. IlligalArgumentException未经检查的异常
  2. \n
  3. UserNotFoundException未经检查的异常
  4. \n
  5. AnalyticsAPIException已检查的异常
  6. \n
\n

我读到,最好的做法是从 try 开始该方法并以 catch 结束,而不是在一个方法中乘以 try-catch 块。

\n
\n

优先使用异常而不是错误代码 我们更喜欢使用异常而不是错误代码\n因为它们更加明确。在处理 try / …

java architecture refactoring exception clean-architecture

3
推荐指数
1
解决办法
868
查看次数