数据库名称: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;
如何解决这个问题?
答案 0 :(得分:0)
USE
不是valid command in PostgreSQL。必须是SQL服务器代码中的工件。连接到数据库不是Postgres中SQL代码的一部分。
许多代码在Postgres中完全无效。例如,普通SQL中没有变量:
您必须使用PL/pgSQL或其他过程语言。@sal
您需要完全重写此内容。但是,这个问题从答案中得到了太多的答案。先做好你的作业。
答案 1 :(得分:-1)
有关丢失更新问题的详细信息,请参阅https://vladmihalcea.com/a-beginners-guide-to-database-locking-and-the-lost-update-phenomena/。它显示了如何使用两个同步数据库事务模拟丢失的更新
并提出两种可能的解决方案来防止此问题: