【问题标题】:How to ensure execution order如何保证执行顺序
【发布时间】:2017-07-31 16:36:45
【问题描述】:

当涉及不同的数据库操作并且一个操作依赖于其他操作时,有哪些不同的方式和最佳方式来确保执行顺序。 像这样的代码:

String countryName = "name";
Country countryObj = new Country();
countryObj.setName(countryName);
countryObj.setStates(new ArrayList<State>());
// update database
PersistenceManager manager = new PersistenceManager();
List<Country> countries = manager.getAllCountries();                    
if (countries != null && !countries.isEmpty()) {
    for (Country country2 : countries) {
        if (country2.getName().equalsIgnoreCase(countryName)) {
            return;
        }
    }
}
manager.saveCountry(countryObj, country);

这里 manager.getAllCountries() 从数据库中检索所有国家,而 manager.saveCountry 取决于之前的操作

【问题讨论】:

  • 你的数据库/ORM 支持事务吗?
  • 我的数据库是MongoDB,我认为它不支持事务

标签: java multithreading mongodb database


【解决方案1】:

我认为您需要从查看数据建模的角度开始使用atomic operations

您所描述的是插入数据(如果不存在)。您可以使用upsert 执行此操作,并从您的逻辑中查看是否存在该国家/地区,您不想更改任何内容(因为您只是退出该方法)。因此,您可以只使用 $setOnInsert 运算符 - 这样您保存您的 countryObj 的值(如果它尚不存在)。

最后一个障碍是名称匹配 - 因为您正在测试与小写版本名称的等效性 - 您可以在查询中使用 regular expression 但这会完整扫描您在集合中的文档 - 所以另一个另一种方法是存储要匹配的小写名称。

下面是使用 shell 语法查询和插入的示例:

db.collection.update(
   {lname: countryName.toLowerCase()},
   { $setOnInsert: { name: countryName, states: [{name: "Victoria"}]  } },
   { upsert: true }
)

当然,如果您想在country 确实存在的情况下更新任何信息,即使该国家/地区存在,您也可以使用$set 运算符进行更新。

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2021-03-07
    • 2018-01-07
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多