在postgresql中更新多个表的策略

时间:2017-04-28 11:21:33

标签: postgresql transactions visual-foxpro

我是postgresql的新手,在执行大型处理时我需要有关策略的帮助。

我有持有发票的表,此发票表中的记录需要“发布”到多个表中,比如销售表和收入表。 此发票表将由多个用户同时访问,当用户“发布”发票表中的特定记录时,我希望阻止其他用户进行更改和“发布”,直到第一个完成“发布”用户。我该怎么做呢?我应该在交易中包装“发布”吗?

谢谢

感谢Stepel和Landa回复并抱歉不清楚。

这是我目前在Foxpro中使用的编码。

Select InvHeader
If !Rlock()
 Return
EndIf

Select InvDetail
Scan
 do processing and verification 
 ..
 Insert Into tAr ... &&& temporary AR table
 Insert Into tGl ... &&& temporary GL table

EndScan

*** the reason I am using temporary table is that at this stage, the use may 
print out the detail of invoices that are to be posted and can then decide 
whether to proceed to commit the transaction.

Select InvHeader
Replace InvHeader.Posted With .T.

Select tAr
Scan
 do processing ...
 Insert Into Ar (....
EndScan

Select tGl
Scan
 do processing ...
 Insert Into GL ( ...
EndScan

Begin Transaction
 Select Ar
 If !TableUpdate()
  Rollback
  Return
 EndIf

 Select Gl
 If !TableUpdate()
  Rollback
  Return
 EndIf

 Select InvHeader
 If !TableUpdate()
  Rollback
  Return
 EndIf

** everything is ok the commit
End Transaction
Return

我应该使用plpgsql在服务器上执行此发布过程吗?或者Foxpro代码和SqlExec()语句的组合?有没有更好的方法来实现这一目标?

感谢。

1 个答案:

答案 0 :(得分:0)

是的,你应该使用交易。在这种情况下,最敏感的是发票标题的ID。如果你使用

INSERT INTO invoice_header_table VALUES (..) RETURNING id;

您拥有发票标题的唯一ID。

我不确定这是不是你的观点,但我希望这些信息有用。