AR的find()和save() 之间,如果有别的进程修改了数据库,就会导致并发冲突吧?

刚刚试了下这个问题,

$m = MMM::model()->find(‘id=1’);

// 取出的数据 name=‘init’, age=‘10’;

sleep(10); //这期间通过别的手段修改数据库记录 name = ‘mmm’, age=‘20’;

$m->name = ‘hhh’;

$m->save();

结果数据库记录被修改成

name = ‘hhh’, age=‘10’;


是否可以记录原始数据, find() 出来的结果缓存在内存另一个位置中,用户重新设置的属性值 与 原始数据不相互覆盖,在save时,自动判断需要更新的字段。

现在可以使用的方式 是不是 save($attributes) 的方式,手工设置哪些属性需要修改 ???

测试过指定保存的属性,貌似不可以哇

数据库能做到的是确保保存操作的atomic性。如果你希望多条SQL的执行不被干扰,那么需要用transaction。

对于你所举的例子,我认为不用担心。这种结果是可以接受的(另外,你提出的解决方案是不可行的)。

其实这个问题还是主要AR如何只更新部分字段,而不是全部字段! 目前AR在save的时候,会把所有字段再重新写回数据库吧?

请参看 CActiveRecord::save() API说明。你可以指定需要保存哪些column

o(≧v≦)o~~好棒