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が正しくない場合がある問題が修正されます。