如何在Postgresql中模拟丢失的更新?

如何在Postgresql中模拟丢失的更新?,sql,postgresql,concurrency,Sql,Postgresql,Concurrency,数据库名称:dbmcw。 表:丢失\u更新\u演示。 列:工人id、工资。 我试图在Postgresql中模拟丢失的更新。我从中获取了代码。代码是针对SQL Server的。我更改了代码以适应我的数据库。但我不知道它是否适合Postgresql /* TRANSACTION 1*/ USE dbmcw; DECLARE @sal int = 0; BEGIN TRAN; SELECT @sal = salary FROM dbmcw.lost_update_demonstration WHERE

数据库名称:dbmcw。 表:丢失\u更新\u演示。 列:工人id、工资。 我试图在Postgresql中模拟丢失的更新。我从中获取了代码。代码是针对SQL Server的。我更改了代码以适应我的数据库。但我不知道它是否适合Postgresql

/* TRANSACTION 1*/
USE dbmcw;
DECLARE @sal int = 0;
BEGIN TRAN;
SELECT @sal = salary
FROM dbmcw.lost_update_demonstration
WHERE worker_id = 1;
SET @sal = @sal + 10;
WAITFOR DELAY '00:00:05.000';
UPDATE dbmcw.lost_update_demonstration
SET salary = @sal
WHERE ProductID = 1;
SELECT salary
FROM dbmcw.lost_update_demonstration
WHERE worker_id = 1;
COMMIT TRAN;

/* TRANSACTION 2*/
USE dbmcw;
DECLARE @sal int = 0;
BEGIN TRAN;
SELECT @sal = salary
FROM dbmcw.lost_update_demonstration
WHERE worker_id = 1;
SET @sal = @sal + 20;
UPDATE dbmcw.lost_update_demonstration
SET salary = @sal
WHERE worker_id = 1;
SELECT salary
FROM dbmcw.lost_update_demonstration
WHERE worker_id = 1;
COMMIT TRAN;
当我运行这段代码时,Postgresql给出了以下错误:СбБББА:Сббббббббббббббббб。翻译:“错误:语法错误(位置:“使用”)。 第2行:使用dbmcw

如何解决此问题?

使用
不是。必须是SQL server代码中的工件。连接到数据库不是Postgres中SQL代码的一部分

大部分代码在Postgres中是完全无效的。例如,纯SQL中没有变量:
@sal
,您必须使用SQL或其他过程语言

您需要完全重写此内容。但这对答案要求太高。请先做家庭作业。

有关丢失更新问题的更多信息,请参阅。它显示了如何通过两个同时进行的数据库事务模拟丢失更新

并提出了两种可能的解决方案来防止此问题:

  • 可重复读取隔离级别
  • 选择…进行更新