Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ukUwo-003Aus-21 for pgsql-general@arkaria.postgresql.org; Fri, 08 Aug 2025 21:48:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ukUwm-00GeIV-F0 for pgsql-general@arkaria.postgresql.org; Fri, 08 Aug 2025 21:48:20 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ukBmJ-000kh7-Fx for pgsql-general@lists.postgresql.org; Fri, 08 Aug 2025 01:20:15 +0000 Received: from mail-yw1-x1130.google.com ([2607:f8b0:4864:20::1130]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1ukBmG-001JKo-27 for pgsql-general@lists.postgresql.org; Fri, 08 Aug 2025 01:20:14 +0000 Received: by mail-yw1-x1130.google.com with SMTP id 00721157ae682-71b73225060so17291837b3.3 for ; Thu, 07 Aug 2025 18:20:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1754616013; x=1755220813; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=T4iY6ExETLYeGIuraKaA3bY+HHF9QP1ppE4i/j/GDHk=; b=QLFTUmZF+FIQDvkgippNO1+evqwtEqZB6lxrkfKROlwIi6ZuMaqMmsNTcuBCSJD1pG iKujyPTGOXXUfpsqLTa4ndq7zfwlqreK2yQtHqP9UQH7di/WY34SCj3CpRWbSWpYSwpA hdXIPqlSBecXiwqBOBZsK5Y1sJ6qWakwey6LBoIdZllek3E5+DP38xUgUUAIn031mPF7 O3pGU6raKef53Af0CaQvRpnylcvKm4+fJAJCKqviDkrRpnqpIo2l77/J2bdFWMk4bEyX CMVZ8x7MJOd3mu4DlUwrXpgSdRgkjpZ2ZqjhPS3hSUjeBNIwM+LYnwrs+7G4P4ezIM7r 6CDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754616013; x=1755220813; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=T4iY6ExETLYeGIuraKaA3bY+HHF9QP1ppE4i/j/GDHk=; b=ZSdHU7Io6OJfhjM69tCrS2XD1Ad0yEsWriYK6guEpr6erZcy0Y1OpwzavPPc6VyAX+ l+LAdXx8GTv8xJueC4/8h9LMoEtS2vY3VHRbaOdMiYNpQsrXvd3wrNpECihrJ0pM+Jp6 fDkjTBsnpI1GLJ4zZxWecrS5homdlTrwYDEyw+aR8MmJtsPGqiaWtUBGrRJNK7G3dLxj lELq8r4cq/ycDOiK6IinBW8Yqn4s1iJi0uAiMPqmRSoL650RufmnFolXcVtZwEtvGR3j RSwmnuoisrW1KrxqQ5fR13i3yW0/IzW0+1VQXXmeyO0BeRxI5MZj4qPG09u6g32q9PpK RkAA== X-Gm-Message-State: AOJu0YxzRHjHS9qHWxsGQYVX4tYhhhMD0rfw9rKMNoBShyQ+VL7R2Zx+ H7IMo8KWwzX47dFbsErRPErxlgBHcAOivTwRwTS0WVdMRyEJUau11n0ZTr5xPXCsWY3dgziTnel vbvjHjWLHTFdE932iriKsBGPS0LGWaVQ= X-Gm-Gg: ASbGnctdOLvgyqkq3aZoI2qhKx+m+2ogOigmOK85iPxKQjR0P2xyb0YGxLyidHVLlBx +oIyzWN6EDJRk6WiYr1J2tlzz9PrL0gr2z/c1D6LIMn3ir6rURvT5xT9Ixgt3zPiCN18EfluopZ 5OpsfsNna85orD6/yNwAKU+HrsV5CJnKioa9WVN+SEFHgkBR/dOpbHIFX/gdJZbnaRBwTaegv7t v+IKA== X-Google-Smtp-Source: AGHT+IEtVrFDH2hf3rdhrQRf5lko/j1LWOkHkiEvwblEQFAZfnABeCr9ymh0oO1AxvG1AKP3fNupmszrXOUNN1Rvzu0= X-Received: by 2002:a05:690c:d19:b0:71a:3518:d108 with SMTP id 00721157ae682-71bf0cbe8dbmr15774347b3.3.1754616012592; Thu, 07 Aug 2025 18:20:12 -0700 (PDT) MIME-Version: 1.0 References: <1f99e5c1-a203-4441-aa5c-33a3baaf852c@aklaver.com> In-Reply-To: <1f99e5c1-a203-4441-aa5c-33a3baaf852c@aklaver.com> From: Charles Qi Date: Fri, 8 Aug 2025 09:20:00 +0800 X-Gm-Features: Ac12FXw8Owj2y3FwKmllpxubz_ly2cnKfr6717aI7i-nku47iQccJwaIiwrBmHs Message-ID: Subject: Re: When UPDATE a row in a table with BEFORE ROW UPDATE trigger, the XMAX of new tuple is set to current XID To: Adrian Klaver Cc: pgsql-general@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000264d68063bd06033" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000264d68063bd06033 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable As I stated before, when the BEFORE ROW UPDATE trigger is absent, even if we update the same row in multiple subtransactions inside one top transaction, no multixact will be created. Check the attached no_multi.sql for example. Let me clarify the question, when the BEFORE ROW UPDATE trigger is presente= d Q. Why do we need to set the XMAX of the new tuple to the current xid? which risks piling up multixacts quickly in savepoint/exception block scenarios. On Thu, Aug 7, 2025 at 2:22=E2=80=AFAM Adrian Klaver wrote: > > On 8/6/25 05:37, Charles Qi wrote: > > And if we do the updates in multiple subtransactions, multixact will be > > created, which is not created when the BEFORE ROW UPDATE trigger is abs= ent. > > > > Is this behavior by design? If so, what is the purpose for the behavior= ? > > I would say this is by design. My reasoning is that the savepoints are > essentially rollback points and the state of the tuple would need to be > saved for each potential rollback. Hence a different transaction id for > each savepoint. > > > > > Tested version: > > PostgreSQL 14.18 (Ubuntu 14.18-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu= , > > compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit > > > > The attached file reproduce.sql can be used to reproduce the behavior. > > > -- > Adrian Klaver > adrian.klaver@aklaver.com --000000000000264d68063bd06033 Content-Type: application/octet-stream; name="no_multi.sql" Content-Disposition: attachment; filename="no_multi.sql" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_me23zhe50 cG9zdGdyZXM9IyBjcmVhdGUgdGFibGUgdF90ZXN0IChpZCBpbnQsIGNvbnRlbnQgdGV4dCk7DQpp bnNlcnQgaW50byB0X3Rlc3QgdmFsdWVzICgxLCAndGVzdCcpOw0KQ1JFQVRFIFRBQkxFDQpJTlNF UlQgMCAxDQpwb3N0Z3Jlcz0jDQpwb3N0Z3Jlcz0jDQpwb3N0Z3Jlcz0jIFNFTEVDVCB0X3htaW4s IHRfeG1heCwgdF9jdGlkLCByYXdfZmxhZ3MsIGNvbWJpbmVkX2ZsYWdzIEZST00gaGVhcF9wYWdl X2l0ZW1zKGdldF9yYXdfcGFnZSgndF90ZXN0JywgMCkpLA0KTEFURVJBTCBoZWFwX3R1cGxlX2lu Zm9tYXNrX2ZsYWdzKHRfaW5mb21hc2ssIHRfaW5mb21hc2syKQ0KV0hFUkUgdF9pbmZvbWFzayBJ UyBOT1QgTlVMTCBPUiB0X2luZm9tYXNrMiBJUyBOT1QgTlVMTDsNCiB0X3htaW4gfCB0X3htYXgg fCB0X2N0aWQgfCAgICAgICAgICAgICAgcmF3X2ZsYWdzICAgICAgICAgICAgICAgfCBjb21iaW5l ZF9mbGFncw0KLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLQ0KICAgIDc2MSB8ICAgICAgMCB8ICgw LDEpICB8IHtIRUFQX0hBU1ZBUldJRFRILEhFQVBfWE1BWF9JTlZBTElEfSB8IHt9DQooMSByb3cp DQoNCnBvc3RncmVzPSMgYmVnaW47DQpzYXZlcG9pbnQgc3AxOw0KdXBkYXRlIHRfdGVzdCBzZXQg Y29udGVudD0ndGVzdDMnIHdoZXJlIGlkPTE7DQpzYXZlcG9pbnQgc3AyOw0KdXBkYXRlIHRfdGVz dCBzZXQgY29udGVudD0ndGVzdDQnIHdoZXJlIGlkPTE7DQpjb21taXQ7DQpCRUdJTg0KU0FWRVBP SU5UDQpVUERBVEUgMQ0KU0FWRVBPSU5UDQpVUERBVEUgMQ0KQ09NTUlUDQpwb3N0Z3Jlcz0jIFNF TEVDVCB0X3htaW4sIHRfeG1heCwgdF9jdGlkLCByYXdfZmxhZ3MsIGNvbWJpbmVkX2ZsYWdzIEZS T00gaGVhcF9wYWdlX2l0ZW1zKGdldF9yYXdfcGFnZSgndF90ZXN0JywgMCkpLA0KTEFURVJBTCBo ZWFwX3R1cGxlX2luZm9tYXNrX2ZsYWdzKHRfaW5mb21hc2ssIHRfaW5mb21hc2syKQ0KV0hFUkUg dF9pbmZvbWFzayBJUyBOT1QgTlVMTCBPUiB0X2luZm9tYXNrMiBJUyBOT1QgTlVMTDsNCiB0X3ht aW4gfCB0X3htYXggfCB0X2N0aWQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmF3X2ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb21iaW5lZF9m bGFncw0KLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLQ0KICAgIDc2MSB8ICAgIDc2MyB8ICgwLDIpICB8IHtIRUFQX0hBU1ZB UldJRFRILEhFQVBfWE1JTl9DT01NSVRURUQsSEVBUF9IT1RfVVBEQVRFRH0gICAgICAgICAgICAg ICAgICAgICAgICB8IHt9DQogICAgNzYzIHwgICAgNzY0IHwgKDAsMykgIHwge0hFQVBfSEFTVkFS V0lEVEgsSEVBUF9DT01CT0NJRCxIRUFQX1VQREFURUQsSEVBUF9IT1RfVVBEQVRFRCxIRUFQX09O TFlfVFVQTEV9IHwge30NCiAgICA3NjQgfCAgICAgIDAgfCAoMCwzKSAgfCB7SEVBUF9IQVNWQVJX SURUSCxIRUFQX1hNQVhfSU5WQUxJRCxIRUFQX1VQREFURUQsSEVBUF9PTkxZX1RVUExFfSAgICAg ICAgICAgICAgfCB7fQ0KKDMgcm93cyk= --000000000000264d68063bd06033--