确保在PostgresqlDB上为两个worker获得不同的结果

时间:2016-10-10 07:42:42

标签: sql database postgresql locking

我有一个PostgresDB,在一个表中我有服务器IP,现在我想带一堆工作人员去检查我的数据库中的服务器。但我想确保没有两个工作人员获得相同的服务器IP,因此一旦选择了一个IP,它就不能用于所有其他工作人员。

{
  "name": "papp",
  "author": "Ionic Framework",
  "homepage": "http://ionicframework.com/",
  "private": true,
  "scripts": {
    "build": "ionic-app-scripts build",
    "watch": "ionic-app-scripts watch",
    "serve:before": "watch",
    "emulate:before": "build",
    "deploy:before": "build",
    "build:before": "build",
    "run:before": "build"
  },
  "dependencies": {
    "@ionic/storage": "^1.0.3",
    "crypto-js": "^3.1.6",
    "ionic-angular": "^2.0.0-rc.0",
    "ionic-native": "^2.0.3",
    "ionicons": "^3.0.0",
    "ng2-translate": "^3.1.0",
    "@ionic/app-scripts": "latest",
    "typescript": "^2.0.3"
  },
  "devDependencies": {

  },
  "description": "papp: An Ionic project",
  "cordovaPlugins": [
    "cordova-plugin-device",
    "cordova-plugin-console",
    "cordova-plugin-whitelist",
    "cordova-plugin-splashscreen",
    "cordova-plugin-statusbar",
    "ionic-plugin-keyboard"
  ],
  "cordovaPlatforms": []
}

有谁能请我指出如何实现这个目标的好方向?

据我所知,常规锁定不会,因为它只适用于插入,更新,删除,我所做的就是选择。

也许有一种方法可以一步到位地选择和更新,但我还没有发现任何与之相关的内容。 所以这里的一些帮助将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用UPDATE ... RETURNING,如以下示例所示:

UPDATE iptable
SET processed = TRUE
WHERE id IN (SELECT id FROM iptable
             WHERE NOT processed
             LIMIT 1)
RETURNING ip_adress;

此处id是主键 部分索引ON iptable(id) WHERE NOT processed可能会加快查询速度。

或者,您可以在一个交易中使用SELECT ... FOR UPDATEUPDATE

START TRANSACTION;

SELECT id
FROM iptable
WHERE NOT processed
LIMIT 1
FOR UPDATE;

UPDATE iptable SET processed = TRUE WHERE id = ...;

COMMIT;