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 1rlUOv-002iV2-NZ for pgsql-docs@arkaria.postgresql.org; Sat, 16 Mar 2024 13:48:42 +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 1rlUOt-00Fv4I-Ox for pgsql-docs@arkaria.postgresql.org; Sat, 16 Mar 2024 13:48:40 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rlUOt-00Fv4A-CU for pgsql-docs@lists.postgresql.org; Sat, 16 Mar 2024 13:48:40 +0000 Received: from mail-ej1-x62e.google.com ([2a00:1450:4864:20::62e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rlUOq-004rHj-2s for pgsql-docs@lists.postgresql.org; Sat, 16 Mar 2024 13:48:39 +0000 Received: by mail-ej1-x62e.google.com with SMTP id a640c23a62f3a-a46966e9d30so165843566b.1 for ; Sat, 16 Mar 2024 06:48:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec-at.20230601.gappssmtp.com; s=20230601; t=1710596914; x=1711201714; darn=lists.postgresql.org; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:cc:to:from:subject:message-id:from:to :cc:subject:date:message-id:reply-to; bh=FSTUb4AupzTwOOMmWl0tXXC4xeyAD+Bc+FKZ2MFySvs=; b=IZX1RfkVP6sQZ/Br8N2FdJDGf6xLBXp1tYOIYGALqXYTVqOQoS/UAUN1i2M9qHF9Cb ia9TS+NPRGezC2hxJRR5s7BOlcBB08NIyqtGVqKLAIc43mld2WvZ+A22T5mOBWCLGpA/ b81kQNQAG+f3jJlLMo4Hp/v1Z7SQtPjmA4UlKAQ9yajj8pFYXERLjRLpMMOE4Ba7pinL H/AqoyMoiWGy2jdc4M5/e+kwU73aiMB6SNLNv70Z91RVQW5qQ8/C9VUwYs/ZtFhjYtk6 YIevac7hNMrkfNhch4VJvEifso81JBZ49vTy43JEukQG9Vh/KWBRdDlgnLVxAD9Z9Sek u/Bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710596914; x=1711201714; h=mime-version:user-agent:content-transfer-encoding:autocrypt :references:in-reply-to:date:cc:to:from:subject:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=FSTUb4AupzTwOOMmWl0tXXC4xeyAD+Bc+FKZ2MFySvs=; b=wGtkhraL+0zAbJJ84xofGh4uNrEtYsmnc2ISuUrZ+TOMFCUD7arSnaJ40CQkfisBgh PWclIa+c96MNo62nXFupEDLOwFzy6pf0BOWb23kW7+x/XmJBNSPe9EW1KVBTXWTlKzaF vTimpV0KviA5xHK/b90rn1pev7eqsTV316wj8M47wcIt35WFvSToxKvzQL9QCACQ2x68 AlsdJzXv11ngK+gMMnUP5VJRXDoWKNcwHPWyKGlLeRjB3Ni08eSpdxPDA8n3T6/3fg2+ NGvLjMk7z8Jg6ebEAuOLVaMWQQZQr7yCRrtmk3lQ1Xu1QZZwVJLBHUSUwdq6uFjK2REV flqA== X-Gm-Message-State: AOJu0YyKhTWxSB3tz3YGw5sub4uDpwSv6NCg06cP6IAQ3vO6ZPdib3Vx 5XfBg3y9pbnQhtnRlFk3UC3uy2r5gerLSaY6jQDSNctekOcrF9k6s3OHPFQtBG1QnH8I2uYveB6 Z X-Google-Smtp-Source: AGHT+IGNZtklLKDhomzoiGW/g/tcmvsQqYp7YV+rnnaXMbKKaNETmDMRT2r3ZvLUorKvH58llKxGGQ== X-Received: by 2002:a17:906:53d1:b0:a46:47bc:580b with SMTP id p17-20020a17090653d100b00a4647bc580bmr5409734ejo.56.1710596913221; Sat, 16 Mar 2024 06:48:33 -0700 (PDT) Received: from localhost.localdomain ([2001:871:260:9c3d:829c:750a:8cb2:475b]) by smtp.gmail.com with ESMTPSA id ca18-20020a170906a3d200b00a469ebf37dfsm928100ejb.203.2024.03.16.06.48.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Mar 2024 06:48:32 -0700 (PDT) Message-ID: <5f459c76d3decb4e2e9e8b5a2a29daed0e99e0ce.camel@cybertec.at> Subject: Re: Locking From: Laurenz Albe To: Anthony Berglas Cc: pgsql-docs@lists.postgresql.org Date: Sat, 16 Mar 2024 14:48:32 +0100 In-Reply-To: References: <171037536712.644.16792405319486797414@wrigleys.postgresql.org> <7d0e70d3c0ccab7acd4b6f012f8c37a1618d5c3c.camel@cybertec.at> Autocrypt: addr=laurenz.albe@cybertec.at; prefer-encrypt=mutual; keydata=mQINBGGDwAQBEADgbWy5cKXQld3N2mF+DFyiNFbi2oBl2T+XgxpPF8wTRw2D/u4bBKXP0SYSE/lA86jIVNWWU0gf1KODIkVvgJm2w4vH2VBV1b7ddVViGl1Iu+9zaRnv9wulhnH42KefepXnoean6UT1EzLM0opF/Ik0j+40TxdRtobkBprkQUyHDXWlHc2ffPs3SipyFEP9AVLf7ejRC46CXWDnsqjOBSMEW8Z4HiK/8RrPZBsKLts8dJxKF4pygOdJb0CWk8k/X1jbcfdxo+zOLjOMvJcSJ2pFdJmQHU+JufB3rePziqQ2S9Ur6sccr9XnTC1GVBWN4Lf5VHq+vf+bFJjVwg+2hrySZnAVfcOrxoqFLErr7ug1zN2nM1kcpgA4VWn4gxlJtYNYYq+9WxX5dtvnNANlG3ZCrRKQzl8lxtzoF6Zo7LUhEqPaHDwn7Rvs+IdbOn41lF5UDTJGqmC4gS/bZydW2Fy3YWm4aSaN9fgFf8D+PVkrlKAZB7gBLz1TyHjbcRf85cYF+GKKrDld5SzMB/V60VX3oP/Eo8ikFpyWaqiz1f9X7MBot3/PjJkY+wDzp3nmb19QEcOBuQiSQ4xds2r0HewbuHTAR68u8jNNMGmpm2j4x+g09Jd/WQDjqlTBZ/jEltH41fYCCPWMfljXTOOXu2eLNGdfi7ETZogtwjM9oTtSPQARAQABtCdMYXVyZW56IEFsYmUgPGxhdXJlbnouYWxiZUBjeWJlcnRlYy5hdD6JAk4EEwEIADgWIQR0CqhbZGGABqoaSbdi8bhXA2EdmAUCYYPABAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRBi8bhXA2EdmM/6EADK232JCwmBzhlj8h7U9CjG6kx0JHP3uJGv+XfsHtHAlmY/RCwF1BHMEsRlk bT5UrLvJ2jb99bA9QARzhFaxzyn0F/BUKzuIjRGNs/n6d5dNUFA0kOt8sX+TacmC GEyjEBCrVCm4ranBiUyePn9NhHNWnaex7pJyqvMLLdwW9BEMJx0Fqo+DN8ukbXmYRsmhEtd3ue+x/luYmOmJnaGtzInaY5aOJYbW9XqoRIZkZvOCgbi1FfvNmoqWa+3oVxTOgw9RafjJDyW0lTHzKGjbGI5ofMU98l+/hKJFYJqWUF6VpFJY5YIcN/1lf4ZICMwDl+MPIVo/tpq8L10seJL28nLlvw3K+cI+TVW8IW/qL/LyVoDofI3USeOORuYmhpWRhik8JXX6xf3v6GrRilJIPWNFIJbxm1ZblQiQnOw3IOW7T+8nAmPin1HKqM3VrOrJQ2VtShsefNBibNAsr1oFaqcDBkn3yGG8i6CTW+FyO4PZ+/EwNxMVgktxbYdy5AT1/lpXr5tB+phhLIyVfiBvrWs5EThxYMQ/L8Y85c3GMsAy1l/x4h3jqySIYy3SCU9+jc5UVuNnXljbvkEzJ+NLWJ6C1rACFWrMszgPdh5tCrlRY9PpmYll4JbCgb8BtxEIUmR+xr50/ZElEK5iml7Q00KUekCcDt+36PsyGFTXBzNOrkCDQRhg8AEARAAzOZ2tLHlI4rrhG411h6cdCFjBZxuljaFCxFyHn3m6wbGLqwBUWC5k8UrRqjHMz88KcTSaNO7XGAmCqPdWd2SeflPZRnNTbjsVpw7mLdffsBm4JX7kki2Pvk5h0NtYeidXT1PSpc2ri4DutYXuT9uD8RAm1wUDCE5HQNUihT/WH6opt+hskHW21uHao0+y822tG0QQcGMqdQR5Vxdxj89wiEPdqW+HpU/oOZIhrf2E7prduAppxixjHy/o1rcnoznnJvc8D3+YgI9O0LrBMij89dM55pRGbLovTR1oGR3U74sX774+0xmSzeIKwZfiMUz7Atlvfk5SHOsRUFPN2Ux9kaXiiBibQpHFxt7b lDrT4wxdLJ/XCdbPPAyl+lZtOLsaHEEZvYNyTXwZc35dVf3R4/oz20HoG6s7ct8e1 AQygj43XAERzty9SkWgxs8+grp1PrGx6FHVSYRqBM8dS/ZR6yRVwOwJXPyaSSqfIF21DkE4j1y4n+ItSewPGoRp8K/yWCikt6qlkVkO2ASNIiX04fAbtzwVOaNn8ZMRNqyvLc1fED4sr49onE4cAIcBLjcC3KL+w9DUGRQCdziROj5H2Yl/sXGPdMciUHo/Uz2rggc+2th3bQiMhrHWSsBpUkDQp0yWewemstPpPgBL3h2fHKaX8B9oH5Qu/H1IgrOuX8AEQEAAYkCNgQYAQgAIBYhBHQKqFtkYYAGqhpJt2LxuFcDYR2YBQJhg8AEAhsMAAoJEGLxuFcDYR2YuPwQAMkpGtR80pQ1gVsONhdkqj0H2eU66efP/gO3CoyaoIcvrpKYj7C2HipVSmkt1gpByL0X4AMQ/vKuknUz3wd28Ba+G1dCfbVs/Xiusq+SmpUj5rTwmYqdSjWMuCo1R6oS5hdJMdUUJYGMT0QkVlm1KnW8jkmCTl9GzjDxOAsN9O6/6lPzaGFtk9XF+34Bry/N4HKiJkqpC4+UTd0AprPfzJ2jdT64e1F0+W88X8y1bTTgNrHwK4mDiLnlE4SKRuEm54lNhJz//ar86Or5BErzNpM6TL7lk44QS06hwsMrEdKIy8J/SYJPjfzR8tIUnKscclVpOgjKaBqC+0iFiVaRqAgfOlIEiezX6kMh5Q2FIUfqs46qWhhXjRrdKOEoStYAaikdLu5ZXr7vfb0ZaDh+ZwTQtbSMFolyOkecwI81MCdbMfT/1TqIGTOdAj5as9fAakk0jb2pXgUYQ8X1DVTR8ahSDVEaw9VTmWiSvTxvguVJ1Mb7gG4Gmh6aviDTJhfXtH4rPUNXhDLqrTH8JkJjyKROOMakIF68Hjse5vUfUxreBEOtb5r1Coa2Fe7ncJayaSE7ryrDbFqpZ 36UMAx4ulWMyqJajLNGY0DdG8qIsR5nxRhrnK/mrCidZ8F9/D3bWAl4rjtHlsztN59 +AnW5l0HsQcY9ntFL/zEBOaonjdJf Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.50.4 (3.50.4-1.fc39) MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Sat, 2024-03-16 at 10:52 +1000, Anthony Berglas wrote: > The code is wrong by any normal definition.=C2=A0 We lose one of the upda= tes. > It is a very common error.=C2=A0 It=C2=A0is a very common way to write co= de, > especially if using an ORM, which is very common. >=20 > [example of a lost update] > > The problem is that this fundamental problem is lost in all the escoteric > details of locking. >=20 > Sure, a database expert that carefully studies the docs might figure it > out if they did not already know it.=C2=A0 But the other 99.9% of users w= ill > just consider Postgresql to be buggy because balances do not add up. >=20 > So I think something in the docs is very much necessary. Yes, the "lost update" is a common and well-known transaction anomaly, and every developer should know about it. What you are looking for is a tutorial about database transactions. There are fundamental differences between a tutorial and documentation. A tutorial is an example-based introduction aimed at beginners, while the documentation describes the behavior in greater detail, aiming for rigorourness and completeness. Now there is a tutorial inside the PostgreSQL documentation, and it even has a chapter about transactions: https://www.postgresql.org/docs/current/tutorial-transactions.html It even talks some about transaction isolation, but doesn't go as far as mentioning anomalies and the individual isolation levels. Perhaps you feel inspired to write a patch for that page that demonstrates the lost update and shows how to avoid it using the REPEATABLE READ isolation level? Yours, Laurenz Albe