MySQL事务学习

在MySQL中,通过START TRANSACTION或者BEGIN来开始一个事务,以COMMIT或者ROLLBACK来结束一个事务。

MySQL默认的隔离级别为可重复读。

MySQL有一个变量autocommit,默认值为 ON 。当该值为 ON 时,在每一个会话中,每一次SQL查询都会作为一个单独的事务执行。如果该值为 OFF,那么每一个会话就是一个事务,需要明确执行 commit 或者 rollback 。


Read more...

2014-04-05 事务

Yii是如何产生视图文件?

一般我们会在控制器中调用:$this->render('contact', array('model'=>$model));

在经过一系列预处理后,会调用CBaseController的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
{
    // we use special variable names here to avoid conflict when extracting data
    if(is_array($_data_))
        extract($_data_,EXTR_PREFIX_SAME,'data');
    else
        $data=$_data_;
    if($_return_)
    {
        ob_start();
        ob_implicit_flush(false);
        require($_viewFile_);
        return ob_get_clean();
    }
    else
        require($_viewFile_);
}
  • 该方法先判断render()的第二个参数是否为数组,如果为数组,导出变量,否则直接赋值给$data
  • 如果需要返回,那么会通过PHP Output Control功能将要输出的视图文件转换为字符串返回。
  • 否则直接包含文件。

Read more...

2014-04-01 PHP应用

TSRM 线程安全资源管理器

学习自:第三节 PHP中的线程安全深入研究PHP及Zend Engine的线程安全模型究竟什么是TSRMLS_CC?

综合以上三篇文章,再看一下 PHP 源码才明白 TSRM 是怎么回事,这里做个学习记录。

线程安全


当PHP运行于多线程服务器时,处理请求的生命周期如下图:

在没有 TSRM 的时候,将会存在非线程安全问题,线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

在PHP的进程中,存在许多全局变量,比如许多符号表。


Read more...

2014-03-30 PHP底层

UML类图关系:继承、实现、依赖、关联、聚合、组合

学习自:UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别 和 《UML和模式应用》

继承

一个类继承另外一个类,或者一个接口继承了其他接口。

1
2
3
@startuml
ClassA <|-- ClassB
@enduml

Read more...

2014-03-27 UML

JSONP是如何实现跨域请求的?

学习自:说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

条件


  1. 由于JS的同源策略限制,无法通过AJAX向其他域发送请求;
  2. 凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<script><img><iframe>
  3. JS可动态为当前DOM结构增加和删除节点;
  4. 当浏览器请求一个JS文件时,会执行请求返回的内容。

Read more...


MySQL查询优化学习

学习自《高性能MySQL 第三版》和网络资源

一张图了解MySQL执行SQL语句过程:

是否向数据库请求了不需要的数据


  • 查询了不需要的记录
  • 多表关联时返回全部列
  • 总是取出全部列

解决方案:1、使用 LIMIT;2、避免使用 *,从而有机会使用索引覆盖查询。


Read more...

2014-03-20 MySQL查询优化

MySQL EXPLAIN学习

参考自:Mysql Explain 详解EXPLAIN Output Format

EXPLAIN 列输出解析:

id


SELECT 标识,是执行 SELECT 的顺序。该值可以为 NULL ,如果是引用了 union 的结果。在这种情况下,table 列的值应该像<unionM,N>,表示被 union 的行的id值为 M 和 N。


Read more...

2014-03-18 MySQL查询优化