This django con talk https://youtu.be/iFM8DZaeM_M?si=YQjSq0x1KU2ZtIRE
The sql update statement lock the rows before applying changes, which is why the locking is not explicit, but there is still some locking involve.
The sql equivalent of the bulk version will look something this
BEGIN TRANSACTION;
UPDATE "accounts_account"
SET "balance" = CASE
WHEN ("accounts_account"."id" = %s) THEN ("accounts_account"."balance" - %s)
WHEN ("accounts_account"."id" = %s) THEN ("accounts_account"."balance" + %s)
ELSE NULL
END
WHERE (("accounts_account"."balance" >= %s AND "accounts_account"."id" = %s) OR "accounts_account"."id" = %s)
COMMIT;