Maison  >  Article  >  php教程  >  thinkphp 的事务回滚处理 和 原始PHP的事务回滚实例,thinkphp实例

thinkphp 的事务回滚处理 和 原始PHP的事务回滚实例,thinkphp实例

WBOY
WBOYoriginal
2016-06-13 09:07:421278parcourir

thinkphp 的事务回滚处理 和 原始PHP的事务回滚实例,thinkphp实例

1.  要程序里面支持事务,首先连接的数据库和数据表必须支持事务 mysql   为例:

数据库InnoDB支持 transactions

 

数据表支持事务:InnoDB  支持transaction

2. 框架thinkphp  支持事务代码

<span>public</span> <span>function</span><span> testrollback(){
</span><span>$model1</span> = D('item'<span>);
</span><span>$model2</span> = D('vote'<span>);
</span><span>$model1</span>-><span>startTrans();
</span><span>$res1</span> = <span>$model1</span>->where('id = 5')-><span>delete();
</span><span>$res2</span> = <span>$model2</span>->where('id = 2')-><span>delete();
dump(</span><span>$res1</span><span>);
dump(</span><span>$res2</span><span>);
</span><span>if</span>(<span>$res1</span> && <span>$res2</span><span>){
</span><span>$model1</span>->commit();   <span>//</span><span>只有$res1 和  $res2  都执行成功是才真正执行上面的数据库操作</span>
dump("commit"<span>);
}</span><span>else</span><span>{
</span><span>$model1</span>->rollback();  <span>//</span><span>  条件不满足,回滚</span>
dump("rollback"<span>);
}
dump(</span>"over"<span>);
</span><span>exit</span><span>;
}</span>

 

 

 

3.  原始PHP 代码事务实例

方法一:只支持数据库和数据表都是 innoDB  的情况

<span>public</span> <span>function</span><span>  rollbackoriginal1(){
        </span><span>$conn</span> = <span>mysql_connect</span>('127.0.0.1','summerzi','summerzi') or <span>die</span>('DB connection failed!'<span>);
        </span><span>mysql_select_db</span>('summer',<span>$conn</span><span>);
        </span><span>mysql_query</span>('set names "GBK"'<span>);
        </span><span>mysql_query</span>('BEGIN'<span>);
        </span><span>$sql1</span> = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(41,1,233);"<span>;
        </span><span>$sql2</span> = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(fdfd,2,235);"<span>;
        </span><span>$res1</span> = <span>mysql_query</span>(<span>$sql1</span><span>);
        </span><span>$res2</span>  = <span>mysql_query</span>(<span>$sql2</span><span>);
        dump(</span><span>$sql1</span><span>);
        dump(</span><span>$sql2</span><span>);
        dump(</span><span>$res1</span><span>);
        dump(</span><span>$res2</span><span>);
        </span><span>if</span>(<span>$res1</span> && <span>$res2</span><span>){
            </span><span>mysql_query</span>('COMMIT'<span>);
            dump(</span>'commit success!'<span>);
        }</span><span>else</span><span>{
            </span><span>mysql_query</span>('ROLLBACK'<span>);
            dump(</span>'commit failed, rollback!'<span>);
        }
        </span><span>mysql_query</span>('END'<span>);

    }</span>

方法二:(注意:对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法)

<span>public</span> <span>function</span><span> rollbackoriginal2(){
        </span><span>$conn</span> = <span>mysql_connect</span>('127.0.0.1','summerzi','summerzi') or <span>die</span>('DB connection failed!'<span>);
        </span><span>mysql_select_db</span>('summer',<span>$conn</span><span>);
        </span><span>mysql_query</span>('set names "GBK"'<span>);
        </span><span>mysql_query</span>('SET AUTOCOMMIT=0');<span>//</span><span>//设置mysql不自动提交,需自行用commit语句提交</span>
        <span>$sql1</span> = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(41,1,233);"<span>;
        </span><span>$sql2</span> = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(44,2,235);"<span>;
        </span><span>//</span><span>mysql_query("LOCK TABLES `hmbl_userdata` WRITE");//锁定表</span>
        <span>$res1</span> = <span>mysql_query</span>(<span>$sql1</span><span>);
        </span><span>$res2</span>  = <span>mysql_query</span>(<span>$sql2</span><span>);
        dump(</span><span>$sql1</span><span>);
        dump(</span><span>$sql2</span><span>);
        dump(</span><span>$res1</span><span>);
        dump(</span><span>$res2</span><span>);
        </span><span>//</span><span>mysql_query("UNLOCK TABLES");//解除锁定</span>
        <span>if</span>(<span>$res1</span> && <span>$res2</span><span>){
            </span><span>mysql_query</span>('COMMIT'<span>);
            dump(</span>'commit success!'<span>);
        }</span><span>else</span><span>{
            </span><span>mysql_query</span>('ROLLBACK'<span>);
            dump(</span>'commit failed, rollback!'<span>);
        }
        </span><span>mysql_query</span>("SET AUTOCOMMIT=1"<span>);
        </span><span>mysql_query</span>('END'<span>);
        

    }</span>

php + mysql  对事务的处理比较简单,涉及到业务中多个数据操作,就可以考虑用事务处理

 

 

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn