What’s new in v23.2LTS-patch20240311


New builtins

New service

General changes

Bug fixes

Danger

本patchはretrieveメソッドの不具合を含むため非推奨patchとさせて頂きます。

  • atom.{ModelName}.retrieve組み込みメソッドでfor_update=Trueもしくはfor_share=Trueを指定し、かつwhere条件の引数を指定した場合、返却されるインスタンス配列にwhere条件を満たしていないものが含まれる場合がある不具合が修正されます。

Warning

本件はv23.1LTS以降のバージョンで発生する不具合でした。DBトランザクションが並列実行され、それぞれの処理に含まれるretrieveメソッドがほぼ同時に実行される場合に稀に発生するタイミングイシューです。

[改善事象例の紹介]
shell1 (先に実行します)
>>> async with model.aiodb() as conn:↵
>>>   async with conn.begin() as tran:↵
>>>     r = (await atom.Aaa.retrieve(conn=conn, name="hoge", for_update=True))↵
>>>     print(r)↵
>>>     r[0].name="foo"↵
>>>     await r[0].save(conn=conn, tran=tran)↵
>>>     await asyncio.sleep(10) # 事象を発生させるためのsleepとなります。↵ 
...     print(r)↵
... ↵
[Aaa(instance='QWFhOjc4YTRiODQ2ZGQyMDExZWViMWNjMTZjODc5YzI0OWJi', xid=None, xname=None, name='hoge')]
[Aaa(instance='QWFhOjc4YTRiODQ2ZGQyMDExZWViMWNjMTZjODc5YzI0OWJi', xid=None, xname=None, name='foo')]

shell2 (時間をおかずに続いて実行します)
>>> async with model.aiodb() as conn:↵
>>>   async with conn.begin() as tran:↵
...     r = await atom.Aaa.retrieve(conn=conn, name="hoge", for_update=True)↵
... ↵
↵
>>> r↵
... ↵
↵
[]  # 以前のversionでは、shell1で変更後のname='foo'のインスタンスが返却されてしまいます。
  • Error組み込みオブジェクトをraiseした場合、実装した一部toyblockにおいてresponse bodyが正しくない場合がある問題が修正されます。

Modules