如何在Postgresql中模拟LOST UPDATE?

时间:2014-03-31 22:51:14

标签: sql postgresql concurrency

数据库名称:dbmcw。 表:lost_update_demonstration。 专栏:worker_id,薪水。 我试图模仿Postgresql中丢失的更新。我从here获取了代码。代码适用于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发出此错误:ОШИБКА:ошибкасинтаксиса(примерноеположение:“USE”)。翻译:“错误:语法错误(位置:”USE“)。 第2行:使用dbmcw;

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

USE不是valid command in PostgreSQL。必须是SQL服务器代码中的工件。连接到数据库不是Postgres中SQL代码的一部分。

许多代码在Postgres中完全无效。例如,普通SQL中没有变量:@sal您必须使用PL/pgSQL或其他过程语言。

您需要完全重写此内容。但是,这个问题从答案中得到了太多的答案。先做好你的作业。

答案 1 :(得分:-1)

有关丢失更新问题的详细信息,请参阅https://vladmihalcea.com/a-beginners-guide-to-database-locking-and-the-lost-update-phenomena/。它显示了如何使用两个同步数据库事务模拟丢失的更新

enter image description here

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

  • 可重复读隔离级别
  • SELECT ... FOR UPDATE