投稿

12月, 2021の投稿を表示しています

SQLServer利用時はトランザクション分離レベルに気を付けて

DBにSQLServerを使用している場合になりまして、事象と対応方法については簡単なのですが、私には詳しい説明が難しいため、先に簡潔に現象を説明します。 「長い更新処理が行われている間、別のユーザーがそのテーブルにアクセスするとデータが取得できない」 <事象の再現> ※SQLServerをデフォルトのまま使用していると再現できます。  Azure for SQLServerの場合は対応されているので、再現しません。 ①SQLServer Management Studioのクエリから一つのテーブルをUpdateを行います。  その際、トランザクションを開始してロックしたままの状態にしてみます。 BEGIN TRAN Update [KM01_KOKYAKU] Set   [KM01_REV_NO] = 7 Where [KM01_KOKYAKU_CD] = 'CC0002' ※Update文は適時調整してください。 この状態だとまだデータは確定されておらず、CommitかRollbackするまではロック状態です。 ②ロック状態のままGeneXusで生成したシステムから、  上記のテーブルの一覧画面や登録画面を開いて、データにアクセスしてみてください。  データが表示されないはずです。(画面が表示されないことも)  データがロックされているため、Selectできない状態となります。 ③次にSQLServer Management StudioのクエリからCommitを実行してみてください。  すると、GeneXusの画面でデータが表示されると思います。 <原因> SQLServerのトランザクション分離レベルがデフォルトだと「READ COMMITTED」であること、 GeneXusが生成するSQL文にはWITH(NOLOCK)が記述されていないことが合わさって上記の現象となります。 GeneXusは以前はSQLServerの場合にSQL文にWITH(NOLOCK)をつけていたのですが、 それだとダーティリードが発生してしまうため、WITH(NOLOCK)を外すように修正されました。 GeneXus コラボDB http://www.gxsupport.jp/gxfaq/faqdisplay.aspx?2961 GeneXus日本語SAC https

17U4バージョンで注意

現時点で最新のGeneXus17U4ですが、運用で困る不具合がありました。 HttpRequest.RemoteAddressにて取得できる値が、17U2ではクライアントのIPアドレスですが、 17U4でサーバーのIPアドレスが取得されるようになってしまいました。 そもそもRemoteAddressはプロキシを使用していたり、 ネットワーク構成によっては正しくクライアントのIPが取れないこともあるのですが、 今回の場合は、以下のどのやり方でもすべてサーバーのIPアドレスが返却されてしまいました。 WebPanelのイベント &W_IP1 = &Httprequest.RemoteAddress &W_IP2 = &Httprequest.GetHeader("X-Forwarded-For") java [!&W_IP3!] = getHttpContext().getRequest().getRemoteAddr(); また、GeneXusから出力されるログ(デフォルトだとclient.log)のIPアドレスも サーバーのIPアドレスになってしまうため、運用で非常に困る状況になります。 ちなみにTomcatのアクセスログのIPアドレスはクライアントでしたので、 あくまでもGeneXusから出力されるIPアドレスの問題のようです。 ★★★ 当現象について、17U5で既に解消済みとのことでして、 日本版では17U6が2021年12月下旬にリリース予定となっております。