After switching to PostgreSql 9.1 serializable transaction level for all 
transactions during posting single document errors

40001:ERROR: could not serialize access due to read/write dependencies among 
transactions
Reason code: Canceled on identification as a pivot, during write.;

started to appear in log file.

Code which causes them is below.

Code involves only single document (in this example id 95162) . Is document is 
probably not accesed by others.
How to fix or diagnose this error ?

tasutud1 is temporary table created in transaction earlier:

CREATE TEMP TABLE tasutud1 (dokumnr INTEGER, tasutud NUMERIC(1)) ON COMMIT DROP

Other tables are permanent tables updated and accessed by 7 users concurrently.


Code where exception occurs is :

CREATE TEMP TABLE ids(dokumnr INT) ON COMMIT DROP;
INSERT INTO ids VALUES(95162);
analyze ids;UPDATE DOK set
      kinnitatud = TRUE,
      doksumma=CASE WHEN TRUE THEN COALESCE(doksumma.doksumma,0) ELSE 0 END,
      tasumata =CASE WHEN TRUE AND dok.krdokumnr IS NULL and
      dok.doktyyp IN ('G','O') THEN
           doksumma.doksumma-COALESCE(doksumma.tasutud,0) ELSE 0 END
     FROM
(SELECT 
    ids.dokumnr,
    SUM( CASE WHEN rid.toode is NULL OR LENGTH(RTRIM(rid.toode))>2 OR 
toode.grupp<>'S' or
               (STRPOS(toode.klass,'T')!=0 AND STRPOS(toode.klass,'E')=0)
      THEN
        ROUND(COALESCE(rid.hind,0)*CASE WHEN COALESCE(rid.kogus,0)=0 THEN 1 
ELSE rid.kogus END*CASE WHEN COALESCE(rid.kogpak,0)=0 THEN 1 ELSE rid.kogpak 
END,2) ELSE 0 END ) AS doksumma,
    max(tasutud1.tasutud) as tasutud
  FROM ids 
  JOIN dok USING(dokumnr)
  JOIN rid USING(dokumnr)
  LEFT JOIN toode USING(toode)
  LEFT JOIN tasutud1 ON tasutud1.dokumnr=ids.dokumnr
WHERE not rid.fifoexpens and not rid.calculrow
  and (not dok.inventuur or rid.kogus<>0 )
GROUP BY 1
) doksumma 
left join bilkaib on bilkaib.dokumnr=doksumma.dokumnr and bilkaib.alusdok='LO'
WHERE dok.dokumnr=doksumma.dokumnr

Should this code split into multiple commands to find which part causes 
exception or other idea ?

Andrus.

Reply via email to