[Codeigniter-users] updateがうまくいかない?( CIで構築したサイトでコンペ受賞しました)

Back to archive index

kabayan kabay****@adlib*****
2008年 3月 19日 (水) 04:17:37 JST


加畑です。

はずかしーー!レポートありがとうございます。
記事のせいか、なんかどんどんいろいろな人が使い始めているようで、DBの書き込み
速度が
間に合わず、妙なデータが書き込まれてしまっていました。
とりあえずパッチをあてて修正しましたが、、、

※※※※※
コードの書き方(と設計)が悪いかもしれませんが、DBに書き込んだデータがコミッ
トされる
タイミングが不安定?です。activerecordの使い方に問題があるのでしょうか?
具体的には下記のコードで-9999が検出されます。しかし毎回ではなく、タイミン
グ、発生条件
の再現性はありません。
アドバイス等いただけるととても助かります!
------------
Tabel sl_memoryにはautoinclimentの列、idがあるとします。

ある連続したデータがsl_memoryに書き込まれるのですが、同時に複数が書き込むた
め
Owner_Nameで区別しています。

//新しいデータが来たら、まず、同じOwner_Nameのデータの最後(最新)のstartid列
を
取得しようとします。
		$this->db->where('Owner_Name', $req['Owner_Name']);
	//idが一番大きな行のstartidを探す。すなわち最後にinsertされた行を探
しています。
			$this->db->orderby('id','desc');
			$res = $this->db_get('sl_memory',1,0);
			$row = $res->row();
			$startid = $row->startid;
// ここで0ということはtableのデフォルト値のまま。すなわち後半のupdate(※1)
が動作していない?判別用に-9999をセット
			if ($startid == 0) $startid = -9999;
//最後のレコードidを保存
			$id = $row->id;
//最新レコードを追加
			$this->db->insert('sl_memory', $req);
//追加レコードしたレコードを検索してidを得る。複数のスレッドでinsertの可能性
があるので、再検索しないとidが
正しくない。条件はstartid==0、すなわちinsertされた後、startidがセットされて
いないものになる。
			$this->db->where('Owner_Name', $req['Owner_Name']);
			$this->db->where('startid',0);
			$res = $this->db_get('sl_memory',1,0);
			$row = $res->row();
//追加したレコードのidを保存
			$nextid = $row->id;

//一回前のレコードから現レコードヘのポインタを更新
			$this->db->set('nextid', $nextid);
			$this->db->where('id',$id);
			$this->db->update('sl_memory');

//追加したレコードのstartidを更新
//正しく更新できていればstartidに0が入る可能性はない。※1
			$this->db->set('startid', $startid);
			$this->db->where('id',$nextid);
			$this->db->update('sl_memory');


> -----Original Message-----
> From: codei****@lists*****
> [mailto:codei****@lists*****] On
> Behalf Of 木下 敏夫
> Sent: Wednesday, March 19, 2008 1:08 AM
> To: codei****@lists*****
> Subject: Re: [Codeigniter-users] CIで構築したサイトでコンペ受賞しました
>
> 木下です。
>
> http://mementa.net/mementa/contact/
> もちょっとおかしい見たいです。
>
> レスポンスは凄く良いですね。
>
>
> Kenichi Ando さんは書きました:
> > 安藤です。
> >
> > 加畑さん、こんにちは。
> > 受賞おめでとうございます。すばらしいサイトですね!
> > 事例掲載の許可を頂きたいです。
> >
> > さっそくサイトに接続したところ、
> > http://mementa.net
> > エラーが出ているようです。(2008/0319 0:59現在)
> >
> > ご報告までに。
> >
> >
> > 08/03/17 に kabayan<kabay****@adlib*****> さんは書きました:
> >> 加畑@adlibです。
> >>
> >>  先日行われた日経アーキテクチャ主催のデザインコンペで
> >>  佳作を受賞しました。
> >>
> >>
> http://trendy.nikkeibp.co.jp/article/special/20080313/1008076/?ST=as_
> >> slis
> >>  (次週にはもちっと詳しい解説が載るはずです)
> >>
> >>  応募したのはセカンドライフの人(アバター)の動きをリアルタイムで記録
し、それ
> >>  を再生する
> >>  ことができるメメンタというサービスを使ったものです。
> >>  http://mementa.net
> >>  このサイトはCIでデザインとセカンドライフ内のスクリプトを除き、約1週間
で製作
> >>  しました。
> >>  (デザインは結構苦労したんですけど^o^;)
> >>
> >>  私は元々はASP(.net)とかがメインだったので、PHP系で1から作るのは初めて
だった
> >>  のですが
> >>  CIのおかげでなんとかものになりました。
> >>
> >>  どなたにお礼すべきかわかりませんが、もし事例の隅が空いていてフィラーに
でも
> >>  使っていただければ
> >>  ちょっと恩返しになるかなと思います。
> >>
> >>  今後も改造していくつもり&わかる範囲でノウハウだしをするつもりなのでよ
ろしく
> >>  お願いします。
> >>
> >>  _______________________________________________
> >>  Codeigniter-users mailing list
> >>  Codei****@lists*****
> >>  http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> >>
> >
> > _______________________________________________
> > Codeigniter-users mailing list
> > Codei****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
> >
> >
>
>
> --
> 木下敏夫
> mailto:kino****@tktoo*****
> http://www.tktools.jp/
> http://okusama-shop.com/
> http://www.oidc.jp/bmb/index.php?topic=-m-D14
> --------------------------------------------------------------
> -----------
> ビジネスマッチングブログ・キックオフセミナーにパネリストとして参加します。
> http://www.oidc.jp/bmb/article.php/20080207143305526
> --------------------------------------------------------------
> -----------
>
> _______________________________________________
> Codeigniter-users mailing list
> Codei****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
>




Codeigniter-users メーリングリストの案内
Back to archive index