排他制御に関する質問

18 views
Skip to first unread message
Message has been deleted

ささき

unread,
Apr 14, 2008, 3:28:24 AM4/14/08
to kagemai-users
はじめまして、ささきと申します。

影舞0.8.6を利用しています。
あるバグ票に別々の人がリプライを記入して同時に更新をした場合ですが、
後の書き込みが有効となり、前の書き込みが消えてしまう現象が発生しています。
排他制御ができていないと思われます。

既知の問題でしょうか。
最新バージョン(0.8.8)では試していないのですが、リリースノートにはありませんでした。
それとも何か設定があるのでしょうか。

宜しくお願い致します。

FUKUOKA Tomoyuki

unread,
Apr 14, 2008, 7:47:14 AM4/14/08
to kagema...@googlegroups.com
福岡です。

08/04/14 に ささき<sasa_...@yahoo.co.jp> さんは書きました:


> 影舞0.8.6を利用しています。
> あるバグ票に別々の人がリプライを記入して同時に更新をした場合ですが、
> 後の書き込みが有効となり、前の書き込みが消えてしまう現象が発生しています。
> 排他制御ができていないと思われます。

影舞の動作環境とデータの保存形式を教えてもらえるでしょうか。

--
FUKUOKA Tomoyuki

ささき

unread,
Apr 14, 2008, 10:54:36 PM4/14/08
to kagemai-users
ご回答ありがとうございます。

動作環境は以下になります。
・Linux(Debian3.1)
・Apache 2.2.3
・Ruby 1.8.5
・Ruby/DBI 0.1.0
・Ruby/Postgres 0.7.1
・PostgreSQL 8.1.4

データの保存形式はPostgreSQLです。

宜しくお願い致します。


On 4月14日, 午後8:47, "FUKUOKA Tomoyuki" <to.fuku...@gmail.com> wrote:
> 福岡です。
>
> 08/04/14 に ささき<sasa_123...@yahoo.co.jp> さんは書きました:

FUKUOKA Tomoyuki

unread,
Apr 15, 2008, 11:07:46 AM4/15/08
to kagema...@googlegroups.com
福岡です。

08/04/15 に ささき<sasa_...@yahoo.co.jp> さんは書きました:
>
> ご回答ありがとうございます。
(snip)
> > データの保存形式はPostgreSQLです。

Linux マシンにとりあえずはいっていた 0.8.7 でいろいろ
試しましたが今のところ再現しませんねえ・・・

たとえば、問題の起こったレポートの ID が 10 だったとして、
psql で Postgres につないで

> select count(*) from messages where report_id = 10;

と実行してみてもらえるでしょうか。(10は問題の起こったIDに変えて。)
それで表示された値と、影舞上でレポートを見たときの履歴の数は
同じになっているでしょうか?

--
FUKUOKA Tomoyuki

ささき

unread,
Apr 15, 2008, 10:30:29 PM4/15/08
to kagemai-users
ご助言、ありがとうございます。

test990=# select count(*) from messages where report_id = 1;
count
-------
3
(1 row)

となりました。

影舞上の履歴も3で一致しています。

個々の履歴の内容も問題ないのですが、テキストフィールドの内容が正しく反映できていません。

現象を補足します。

(1)バグ票を起票(No1)

この後、ほぼ同時にリプライをするために、2台の端末でNo1のバグ票を開き、編集しておく。

(2)端末AからNo1のバグ票のテキストフィールドにtest001と記入し、リプライする。
(3)端末BからNo1のバグ票のテキストフィールドにtest002と記入し、リプライする。
   タイミングは(2)を操作してから1秒後に。

履歴としては3件あり、
2件目にはtest001
3件目にはtest002
と表示されている。

ただ、実際のバグ票を見ると、test002しか反映されていない。

以上です。
宜しくお願い致します。

ささき

unread,
Apr 16, 2008, 3:53:04 AM4/16/08
to kagemai-users
最新バージョン(0.8.8)でも試してみましたが、結果は同じでした。

影舞上で何か設定があるのでしょうか。
それとも環境で不足していることがありますか。

宜しくお願い致します。

FUKUOKA Tomoyuki

unread,
Apr 16, 2008, 10:47:23 AM4/16/08
to kagema...@googlegroups.com
福岡です。
こんばんは。

08/04/16 に ささき<sasa_...@yahoo.co.jp> さんは書きました:


> test990=# select count(*) from messages where report_id = 1;
> count
> -------
> 3
> (1 row)
>
> となりました。
>
> 影舞上の履歴も3で一致しています。
>
> 個々の履歴の内容も問題ないのですが、テキストフィールドの内容が正しく反映できていません。

DB上ではデータは正しく入っているみたいですね。
履歴にも表示はされていると。

> 履歴としては3件あり、
> 2件目にはtest001
> 3件目にはtest002
> と表示されている。
>
> ただ、実際のバグ票を見ると、test002しか反映されていない。

ここで言っているバグ票というのは、何を指しているのでしょう?
レポートを表示したときの「最新状況」でしょうか

--
FUKUOKA Tomoyuki

ささき

unread,
Apr 16, 2008, 9:35:38 PM4/16/08
to kagemai-users
説明不足で申し訳ありません。

バグ票(No1)に対して、端末A、端末Bからリプライ後、バグ票の最新状況を確認します。

本来でしたら、テキストフィールドには
-------------------------------------------------------
test001
test002
-------------------------------------------------------
と入っているはずですが、
-------------------------------------------------------
test002
-------------------------------------------------------
しか入っていませんでした。
(履歴にはtest001は表示されているのですが、テキストフィールドから欠落しています)

以上です。
宜しくお願い致します。

FUKUOKA Tomoyuki

unread,
Apr 17, 2008, 11:07:14 AM4/17/08
to kagema...@googlegroups.com
福岡です。

おそらく、内容フィールドをレポート属性にして最新状況に表示させている
のだと思いますが、最新状況はその名前のとおり最新のリプライの内容を
表示します。

つまり、リプライごとにテキストフィールドの内容を追記して表示する
ものではありません。(それ以前に書かれたものは履歴で見れるので。)

というわけで、私が勘違いをしていなければ、

08/04/17 に ささき<sasa_...@yahoo.co.jp> さんは書きました:


> 本来でしたら、テキストフィールドには
> -------------------------------------------------------
> test001
> test002
> -------------------------------------------------------
> と入っているはずですが、
> -------------------------------------------------------
> test002
> -------------------------------------------------------
> しか入っていませんでした。
> (履歴にはtest001は表示されているのですが、テキストフィールドから欠落しています)

こうなるのは意図したとおりの動作です。

複数の端末から同時書き込みなどではなく、1つの端末から
2度書き込んだ場合も同じ振る舞いをすると思いますが
どうでしょうか。

--
FUKUOKA Tomoyuki

ささき

unread,
Apr 18, 2008, 12:58:22 AM4/18/08
to kagemai-users
お忙しい中、返信をいただき、ありがとうございます。

最新状況の確認方法ですが、
「プロジェクト一覧」→(プロジェクトを選択)→
(状態別インデックスから該当のバグ票(レポート)を選択)
→最新状況が表示される。

最新状況ではテキストフィールドの内容が表示されなかったため、
履歴の最後の「リプライをつける」を選択して確認しました。

状況を再度、整理します。

(1)バグ票を起票(No1)
   テキストフィールドには「内容」と記入する。

この後、ほぼ同時にリプライをするために、2台の端末でNo1のバグ票を開き、編集しておく。

(2)端末AからNo1のバグ票のテキストフィールドに「test001」と記入し、リプライする。
(3)端末BからNo1のバグ票のテキストフィールドに「test002」と記入し、リプライする。
   タイミングは(2)を操作してから1秒後に。

履歴を確認すると、
No1
---------
内容
---------

No2
---------
>内容
test001
---------

No3
---------
>内容
test002
---------

(4)端末AからNo1のバグ票のリプライを選択し、テキストフィールドの内容を確認する。
---------
>>内容
>
>test002
---------
↑test001が欠落している。

このように(2)の操作で記入した「test001」が消えています。

同一端末でリプライを繰り返した場合のテキストフィールドには、前回以前の内容は全て
反映されています。

以上、宜しくお願い致します。

FUKUOKA Tomoyuki

unread,
Apr 18, 2008, 9:29:12 AM4/18/08
to kagema...@googlegroups.com
福岡です。

08/04/18 に ささき<sasa_...@yahoo.co.jp> さんは書きました:


> 履歴を確認すると、
> No1
> ---------
> 内容
> ---------
>
> No2
> ---------
> >内容
> test001
> ---------
>
> No3
> ---------
> >内容
> test002
> ---------
>
> (4)端末AからNo1のバグ票のリプライを選択し、テキストフィールドの内容を確認する。
> ---------
> >>内容
> >
> >test002
> ---------
> ↑test001が欠落している。
>
> このように(2)の操作で記入した「test001」が消えています。

影舞のリプライフォームでは、テキストフィールドに「最後」のリプライ
の内容に引用符をつけて表示しています。それまでのリプライのすべてを
引用するわけではありません。つまり、最後のリプライの内容が

---------
>内容
test002
---------

である場合、リプライフォームには(それ以前の投稿が何であれ)、

---------
> >内容
> test002
---------

と表示されることになります。

たとえば、履歴が

No1
-------
ABC
--------

No2
-------
DEF
-------

となっていれば、リプライフォームを表示したときには、
最後のリプライである No2 の内容を引用して、テキスト
フィールドは

-------
>DEF
-------

となります。最後のリプライの前に
何が書き込まれていたかは関係ありません。

> 同一端末でリプライを繰り返した場合のテキストフィールドには、
> 前回以前の内容は全て反映されています。

最後のリプライを引用する仕様のため、引用を消して書き込まなければ、
自然にそれまでのすべての内容が書き込まれることになります。
おそらくその動作が誤解の元になっているのだと思うのですが、
たとえば、履歴が

No1
---------
内容
---------

No2
---------
>内容
test001
---------

となっているとき、リプライフォームを表示すると

---------
>>内容
>test001
---------

となると思いますが、この内容をすべてテキストフィールドから削除して
"ABC" と入力して投稿してみてください。その場合、履歴は、

No1
---------
内容
---------

No2
---------
>内容
test001
---------

No3
---------
ABC
---------

となり、ここでリプライフォームを表示すると

---------
>ABC
---------

となると思います。


--
FUKUOKA Tomoyuki

ささき

unread,
Apr 21, 2008, 12:10:15 AM4/21/08
to kagemai-users
ご回答ありがとうございます。

本来質問したかったことは、排他制御に関することで、
テキストフィールドに同時書き込みを行ったことを例とさせていただきました。

何度も申し訳ありませんが、再度確認させてください。
・同一のバグ票を複数のユーザーにて同時にリプライできないようにすることは可能でしょうか。
 例えば、あるバグ票をユーザーAでリプライ中には、他ユーザーではリプライできない。
 (ただいま編集中である表示を出す等)

こちらで懸念している事は、同一のバグ票を複数ユーザーが同時にリプライできてしまうため、
同時にリプライされた場合には、先にリプライした内容が消えてしまう(履歴上は残るが)ことです。
バグ票を編集できるユーザーが1人に限定することができれば、問題が解決できると思います。

上記の事が設定等で回避できるのでありましたら、方法をご教授いただけないでしょうか。

宜しくお願い致します。

FUKUOKA Tomoyuki

unread,
Apr 21, 2008, 9:08:07 AM4/21/08
to kagema...@googlegroups.com
福岡です。

08/04/21 に ささき<sasa_...@yahoo.co.jp> さんは書きました:


> 何度も申し訳ありませんが、再度確認させてください。
> ・同一のバグ票を複数のユーザーにて同時にリプライできないようにすることは可能でしょうか。
> 例えば、あるバグ票をユーザーAでリプライ中には、他ユーザーではリプライできない。
> (ただいま編集中である表示を出す等)

そのような動作であれば、影舞ではできません。
他の多くの Web ベースのバグ管理システムでもおそらく出来ないと思います。
(技術的には実装できるでしょうが、あまり意味がないので。)


> こちらで懸念している事は、同一のバグ票を複数ユーザーが同時にリプライできてしまうため、
> 同時にリプライされた場合には、先にリプライした内容が消えてしまう(履歴上は残るが)ことです。

記録を履歴に残すのが基本的な使い方だと考えてください。

履歴という呼び方が悪いのかもしれませんが、履歴がいわば
各レポートの本文で、バグレポートを見る=履歴を読む
という使い方を想定しています。

重要なのは履歴なので、懸念されていることが
実用上の問題になることは、普通はないと思います。

リプライのフォームでのテキストフィールドの振る舞いがどうしても
気になるのであれば、「管理」→「フィールドのカスタマイズ」で、
内容フィールドの「リプライ時に前回の内容を引用する」をオフに
設定するとすっきりするかもしれません。

--
FUKUOKA Tomoyuki

ささき

unread,
Apr 22, 2008, 12:20:32 AM4/22/08
to kagemai-users
いつもご回答いただき、大変お手数をおかけしております。

度々で申し訳ありませんが、履歴について確認させてください。

テキストフィールドの内容(ID:body)については、履歴には必ず表示されていると思われます。
通常はフィールドのカスタマイズにて「履歴のヘッダに表示する」をオンにすると履歴に反映されますが、
内容に関しては、このフラグに関わらず常に表示されていますが、この動作は仕様でしょうか。

宜しくお願い致します。

FUKUOKA Tomoyuki

unread,
Apr 22, 2008, 10:49:16 AM4/22/08
to kagema...@googlegroups.com
福岡です。

08/04/22 に ささき<sasa_...@yahoo.co.jp> さんは書きました:


> 度々で申し訳ありませんが、履歴について確認させてください。
>
> テキストフィールドの内容(ID:body)については、履歴には必ず表示されていると思われます。
> 通常はフィールドのカスタマイズにて「履歴のヘッダに表示する」をオンにすると履歴に反映されますが、
> 内容に関しては、このフラグに関わらず常に表示されていますが、この動作は仕様でしょうか。

仕様です。body を非表示にすることは基本的にできません。

どうしても非表示にしたければ、resource/ja/template/_default/view_report.rhtml を
編集するという手もあるにはあります。

--
FUKUOKA Tomoyuki

ささき

unread,
Apr 23, 2008, 2:46:09 AM4/23/08
to kagemai-users
ご回答ありがとうございます。

履歴に関して確認させていただきます。
何度も大変お手数をおかけしております。

履歴を確認する画面(最新状況、履歴、メール通知先の変更)
で履歴を確認することができますが、例えば、投稿後のメッセージ送信完了画面
(メッセージの投稿を受け付けました。投稿されたメッセージの内容は以下の通りです。)
にて最新の履歴番号を設定変更等で表示することはできないでしょうか。

履歴が1~5まである場合に、リプライをすればメッセージ送信完了画面にて、履歴=6と表示するようなことです。

宜しくお願い致します。

FUKUOKA Tomoyuki

unread,
Apr 23, 2008, 9:27:30 AM4/23/08
to kagema...@googlegroups.com
福岡です。

08/04/23 に ささき<sasa_...@yahoo.co.jp> さんは書きました:


> 履歴を確認する画面(最新状況、履歴、メール通知先の変更)
> で履歴を確認することができますが、例えば、投稿後のメッセージ送信完了画面
> (メッセージの投稿を受け付けました。投稿されたメッセージの内容は以下の通りです。)
> にて最新の履歴番号を設定変更等で表示することはできないでしょうか。
>
> 履歴が1~5まである場合に、リプライをすればメッセージ送信完了画面にて、履歴=6と表示するようなことです。

設定などではできませんが、resource/ja/template/_default/add_message.rhtml の
適当な(表示させたい)場所に

履歴=<%= report.size %>

などと書くといけるかもしれません。

--
FUKUOKA Tomoyuki

ささき

unread,
Apr 24, 2008, 4:23:26 AM4/24/08
to kagemai-users
ご教授いただきました内容にて、メッセージ送信完了画面に履歴Noが表示できるようになりました。

ありがとう御座いました。
Reply all
Reply to author
Forward
0 new messages