PostgreSQL á áĄáá˝ááşá¸áááŻááşá¸ ááášáááŹá¸ááťáŹá¸ áĄááŻááşááŻááşááŻáśáááş áĄááťááŻáˇááąáŹ áĄááźáąáĄááąááťáŹá¸áá˝ááş áĄáá˝ááşááťááşááźááşá áąááźáŽá¸ áĄááťááŻáˇááąáŹ áĄááźáąáĄááąááťáŹá¸áá˝ááş ááťááşááźááşáážáŻ ááážáá áąááŤá áááąáˇáá˝ááşá DBMS áá áşááŻáĄááŻááşááŻááşááŻáśáážááˇáş developer á áááşá¸áážááˇáşááźáŻááŻááşáááˇáş áááááášáááźáŹá¸áážá ááášááááşáĽáááŹáá áşááŻááᯠááźááˇáşááŤáááşá UPDATE vs. MVCC á áŹáá°ááťáŹá¸.
ááŹááşáááşá¸áĄááťááşá¸ááž :
áĄáááşá¸áá áşááŻááᯠUPDATE áĄááááˇáşááźááˇáş áá˝ááşá¸ááśááąáŹáĄááŤá ááŻááşááąáŹááşááťááşáážá áşáᯠáĄáážááşááááş ááŻááşááąáŹááşáááş- ááťááşááźááşá¸áážááˇáş áááˇáşáá˝ááşá¸ááźááşá¸áá áşááŻá áááŻááşá¸ááááşáážáááŹá¸áážááşá¸ xmax áááş UPDATE áááŻááŻááşááąáŹááşááąáŹ áá˝áąááąá¸áá˝áąáá°áááśááŤááşáĄááźá áş áááşáážááşááŹá¸áááşá áááŻáˇááąáŹááş áááşááŽá¸áááşá ááŹá¸áážááşá¸áĄáá áş áá°ááŽááąáŹáááŻááşá¸; áááşá¸á xmin áááşáááŻá¸áááş ááááşááŹá¸áážááşá¸á xmax áááşáááŻá¸áážááˇáş áááŻááşááŽááŤáááşá
á¤áá˝áąáá˝ážá˛ááźáąáŹááşá¸áážáŻááźáŽá¸áá˝áŹá¸ááźáŽá¸ááąáŹááş áĄááťáááşáĄáááşááźáŹáá˝ááşá ááŹá¸áážááşá¸áĄááąáŹááşá¸ áááŻáˇáááŻááş ááŹá¸áážááşá¸áĄáá
áşááąáŤáşáá°áááşáááşá COMMIT/ROOLBACK, áĄáááĄáážááşááźáŻááááˇáşáááşá áĄááą tuples ááźááşáááşá¸áá˛áˇáĄá፠VACUUM áááŹá¸áĄáááŻááşá¸áážááşá¸áááşá¸ááŤá

áááŻáˇááąáŹáş á¤áĄááŹáááş ááťááşááťááşá¸ááźá
áşááŹáááşáááŻááşááąáŹáşáááşá¸á "ááąááąáŹáá°" áážááˇáşáááŻááşááąáŹááźáżááŹááťáŹá¸áááş áĄáá˝ááşááťááşááźááşá
á˝áŹááážááááŻááşáááş - áááşááŤááá˛áᲠáááŻáˇáááŻááşá á
áŹá¸áá˝á˛ááźáŽá¸áá
áşááŻáá˝ááşá ááąáŹááşáĄáááşá¸áááşáĄááźáŹáá˝ááş áááŻáááŻáˇááąáŹ áĄááźáąáĄááąáá
áşááŻááᯠááźáŻáśáá˝áąáˇááááşá .
ááśááŤááş 1: áá˝ážáąáˇáááŹááźááŻááşáááşá
áááˇáşááŻááşáááşá¸á ááŻáášááááąááááşá¸áááşá¸áááş áĄááŻááşááŻááşááąááźáŽá¸ áĄááťááŻáˇááąáŹ áážááşáááşá¸áá˝ááş áĄáá˝ááş X ááᯠáĄááşááááşááŻááşáááş áááŻáĄááşááźáąáŹááşá¸ ááŻááşááááş áááááŻááşáááşáááŻááźááŤá ááŻáˇá
UPDATE tbl SET X = <newX> WHERE pk = $1;áááŻáˇááąáŹááşá ááŻááşááąáŹááşáážáŻ áááŻá¸áááşááŹáááşáážááˇáşáĄááťáž Y áĄáá˝ááşáááŻáááşá¸ áĄááşááááşááŻááşáááş áááŻáĄááşááźáąáŹááşá¸ áá˝áąáˇáážáááááşá
UPDATE tbl SET Y = <newY> WHERE pk = $1;Z áááşá¸áážáááąá¸áááş - áĄááąá¸áĄáá˝ážáŹá¸ááąá¸áá˝áąáá˛áˇ ááŹáááŻáˇá áááşáážáŻááşááąáááŹáá˛á
UPDATE tbl SET Z = <newZ> WHERE pk = $1;ááᯠááťá˝ááşáŻááşáááŻáˇáááąááŹááąáˇá áşáá˝ááş á¤áááˇáşáá˝ááşá¸áážáŻááŹá¸áážááşá¸áááşááťážáážáááááşá¸á ááŻááşáááş ááąá¸á áááşá¸áááŻáˇáá˛ááž áá áşááŻáááş áááşáážáááźá áşááźáŽá¸ ááŻáśá¸ááŻááᯠ[áĄáááŻáĄááťáąáŹááş]VACUUM ááźááˇáş áážááşá¸áááşá¸áááş áááŻáĄááşááŤáááşá
áááŻááşááŤáá˛áˇ! ááŻáśá¸ááŤá ááąáŹááşá¸áááŻááťááşáá áşááŻáááşá¸áá˝ááş áĄáá˝ááşáĄáŹá¸ááŻáśá¸ááᯠáĄááşááááşááŻááşááźááşá¸á - áááşá¸áááşá¸áááŻáášááááᯠáĄááźá˛áááşá¸áááŻááᯠá¤áá˛áˇáááŻáˇ ááźáąáŹááşá¸áá˛áááŻááşáááşá
UPDATE tbl SET X = <newX>, Y = <newY>, Z = <newZ> WHERE pk = $1;#2- ááźáŹá¸ááŹá¸ááťááşááᯠáĄááŻáśá¸ááźáŻááŤá ááŻááŹá
ááŤááᯠáááşá¸ááŻááşááťááşááąá¸ááŹá¸á (áĽáááŹá script áááŻáˇáááŻááş converter áááŻáĄááŻáśá¸ááźáŻááąá ááş)á á¤áá˛áˇáááŻáˇááąáŹ áá áşááŻááŻááᯠááŹááşáá˝ážááşá¸áá˝ááş áááˇáşáá˝ááşá¸ááŹá¸áááşá
UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2;áááˇáşáážááşá¸ááźáąáĄáŹá¸ááźááˇáş á¤ááąáŹááşááŻáśá áśá ááąáŹááşá¸áááŻááťááşáááş áááźáŹáá ááźáŻáśáá˝áąáˇáááźáŽá¸ áĄáá˝ááşáá˝ááşáááşáĄáá áşáá˝ááş ááźááˇáşáááşáááŻááşááąáŹáşáááşá¸ áĄááťááŻáˇááąáŹ ááąááŹááťáŹá¸áá˝ááş áĄáážáŹá¸áĄáá˝ááşá¸ááťáŹá¸ááᯠááźááşááąá¸áááşá áááşáážá data áá˝áąáá˛áˇ áážááşáááşáážáŻááᯠááŻáśá¸á áááˇáşáá˝ááşá¸á ááşá¸á áŹá¸áážáŹ áááŻááşááŤáá°á¸á - ááŤááąáááˇáş áĄáááŹá¸áá˛á áááŻáááŻáááşáážáŹá ááťá˝ááşáŻááşáááŻááťááşáááˇáşáĄááŹáĄáááĄááťááŤáážáááťážááşáááşá áááşáá˝ááˇáşáááŻááźááşáááşááąá¸ááŹá¸áááşâáááŻáˇááąáŹáş áĄáááşááźáąáŹááˇáş á áááşáĄáážáąáŹááˇáşáĄáážááşááźá áşááááşá¸á ááźááşááźááĄáąáŹááş-
UPDATE tbl SET X = <newX> WHERE pk BETWEEN $1 AND $2 AND X IS DISTINCT FROM <newX>; á¤áá˛áˇáááŻáˇ áĄáśáˇááźáá˝ááş áĄáąáŹáşáááąáᏠáááşáážááážáŻááᯠáá°áĄááąáŹáşááťáŹá¸ááťáŹá¸á áááááźááąáŹááźáąáŹááˇáş á¤ááąááŹáá˝ááş ááááşáááşáážáŻá
áŹáá˝ááşáá
áşááŻááźá
áşáááşá IS DISTINCT FROM áá°ááŽáááş áĄááźáŹá¸ááŻáášáááááşááąáŹ áĄáąáŹáşáááąááŹááťáŹá¸áážááˇáş

⌠áážááˇáş áážáŻááşáá˝áąá¸ááąáŹ ááŻááşááąáŹááşáážáŻááťáŹá¸áĄááźáąáŹááşá¸ áĄáááşá¸áááş ROW()- áĄááŻáśá¸áĄáážáŻááşá¸ááťáŹá¸

#3 : ááááşáááŻáˇááźááşá¸ áĄáŹá¸ááźááˇáş ááŤáˇááťá áşáá°ááᯠáĄáááĄáážááşááźáŻáááş
á áááşááąáŹááşáá˝ááşááťááşáážáááŤáááşá áá°ááŽááąáŹ ááťááşá¸ááźááŻááşááźá áşá ááşáážá áşááŻáážááşáááşá¸áááşááźááşá¸áĄáŹá¸ "ááŻááşááąáŹááşáá˛" áĄááźá áş áĄáážááşáĄááŹá¸ááźáŻáááş ááźááŻá¸á áŹá¸áááˇáş áá áşááŻá áŽáááş-
UPDATE tbl SET processing = TRUE WHERE pk = $1;á¤ááŻááşáááşá¸á ááşááťáŹá¸áááş ááŽá¸ááźáŹá¸ááŻááşááąáŹááşá ááŹááťáŹá¸ááᯠááŻááşááąáŹááşááąáŹáşáááşá¸ áá°ááŽááąáŹ ID áá˝ááşá ááááĄááźáąáŹááşá¸áĄáá˝ážáąáˇáááźáŽá¸áááťááşá¸ á¤ááąáŹááşá¸áááŻáážáŻáá˝ááş ááŻááá client áááş "ááąáŹáˇáááşááźááşá¸" ááśááááşááźá áşááŤáááşá
ááźáąáážááşá¸ááťááş ááśááŤááş á: ááŻááşááąáŹááşá ááŹááᯠááááşáá áşááŻáááŻáˇ ááťážáąáŹáˇááťááŹá¸áááşá
áááşáááˇáşáááŻááşááĄáąáŹááş IS DISTINCT FROM:
UPDATE tbl SET processing = TRUE WHERE pk = $1 AND processing IS DISTINCT FROM TRUE;á¤ááŻáśá áśáá˝ááşá ááŻáááááąá¸áá˝ááşá¸áááş ááąááŹááąáˇá áşáá˝ááş áááşáááˇáşáĄááŹáááŻááťáž ááźáąáŹááşá¸áá˛áááşáááŻááşááŤá áĄááŹáĄáŹá¸ááŻáśá¸áááş "ááźá áşáááˇáşáááş" áážááˇáşááźáŽá¸ááŹá¸ááźá áşáááş - áááŻáˇááźáąáŹááˇáşááááşáááŻáˇááźááşá¸ááźá áşááŹáááşáááŻááşááŤá áážááşáááşá¸ "áážáŹááá˝áąáˇááŤ" áá°ááąáŹáĄááťááşááᯠáĄáááŽááąá¸áážááşá¸ áĄááşááááŻááŽáááşáá˝ááş áááŻááşáá˝ááşáááşá
ááźáąáážááşá¸ááťááş ááśááŤááş á: áĄááźáśááąá¸ááąáŹáˇáááąáŹááşááťáŹá¸
á¤áááşáážáŹ ááŽá¸ááźáŹá¸ááąáŹááşá¸ááŤá¸áá áşááŻáĄáá˝ááş ááąáŤááşá¸á ááşááźáŽá¸áá áşááŻááźá áşááźáŽá¸ áááşá¸áĄááźáąáŹááşá¸ááᯠáááşáááşáážáŻáááŻááşááŤáááşá .
ááźáąáážááşá¸ááťááş ááśááŤááş á: áááŻáśá¸ááŻááşá¸ááąáŤáşáááŻáážáŻ
ááŤááąáááˇáş ááŤá áááşá¸áĄáá˝ááş ááźá
áşáááˇáşáá˛áˇáĄááŹááŤá áá°ááŽááąáŹáážááşáááşá¸áážááˇáşáĄáá°áá
áşááźááŻááşáááşáĄááŻááşááŻááşáááŻáˇáááŻááş áĽáááŹáĄáŹá¸ááźááˇáş áááşáááş client-side business logic call algorithms ááᯠáá˝á˛ááťáąáŹáşáá˝áŹá¸áááŻááşáááşá ááŹá
ááşá¸á
áŹá¸ááźááˇáşááą...
source: www.habr.com
