首页 » Ecstore » Ecstore单表更新流程详解

Ecstore单表更新流程详解

7436 0

比较长的时间没有更新了,因为一直被ecstore的高并发下订单支付状态回写异常所困恼,所以迟迟没有空,现在问题接近解决了,继续来更新一下。ecos的框架确实比较复杂,牵涉到的文件比较多,花了点时间写这篇文章,以供需要的人查阅。

示例执行代码,以用户登录时,更新members表数据为例。

$b2c_members_model->update($member_data,array('member_id'=>$member_id));

以下是所有执行上面那个update所需要执行的sql过程。
1. 执行base/lib/db/connections->exec()中的exec()方法:

$this->exec('UPDATE sdb_base_cache_expires SET expire = "' . $now . '" WHERE type = "DB" AND name = "' . $table . '"', true);

2. 步骤1执行成功后,执行kv存储:

cachemgr::set_modified('DB', $table, $now)  base/lib/static/cachmgr->set_modified()

3. set_modified()函数具体如下:

self::store_vary_list(self::fetch_vary_list(true)); //kvstore更新
return self::instance()->set_modified($type, $vary_key, $time); //cache,因不会产生sql请求,故此处不讨论

4. self::fetch_vary_list(true)参数为true时,从数据库取数据,并返回数组格式vary_list,vary_list为base_cache_expires表里的type和name字段返回的array。

5. self::store_vary_list(vary_list) 返回代码:

return base_kvstore::instance('cache/expires')->store('vary_list', $vary_list);

6.base/lib/kvstore->store方法中,检查是否需要持久化,即config.php文件中的定义WITHOUT_KVSTORE_PERSISTENT,如果需要,则调用persistent()。

7. persistent()方法内容:

kernel::single('base_kvstore_mysql', $this->get_prefix())->store($key, $value, $ttl); 

8. base/lib/kvstore/mysql->store()将vary_list存入base_kvstore表中做永久存储。

PS,vary_list是以数组的格式作为$data,传递进return app::get(‘base’)->model(‘kvstore’)->update($data, array(‘id’=>$rows[0][‘id’]))进行更新的,在base/lib/db/model中通过base_db_tools::quotevalue函数进行序列化之后存储在value字段中。

9. 执行base/lib/db/connections->exec()中最后mysql_query($sql,$db_lnk)进行对b2c_members表的更新请求。

文章评分2次,平均分5.0

本文原始地址:https://www.tiandiyoyo.com/2016/04/detail-for-update-table/
本站所有文章,除了特别注明外,均为本站原创,转载请注明出处来自www.tiandiyoyo.com

您可能还会对以下文章感兴趣:

评论前先开启评论开关: