发新话题
打印

FleaPHP-中处理事务

FleaPHP-中处理事务

fleaphp中处理事务首先你需要对事务的处理有一定的了解。对于不用fleaphp执行事务,就是在php中直接处理事务,可以先看下:

http://hi.baidu.com/48238398/blo ... 4a47f13a87ce9c.html

下边的是关于在fleaphp中处理事务的,具体这样子做对否,请老大确认下。

总结:在fleaphp中要支持事务。
1,改'driver'=>'mysqlt' 当然,数据表要为innodb类型的ENGINE=InnoDB
2.$dbo=FLEA::getDBO();
   $dbo->startTrans();
   中间写操作数据库的语句,判断是否执行成功
   如果都成功
   $dbo->completeTrans()
   如果有一条不成功
   $dbo->completeTrans(flase)
3.测试中故意
        $rowb=array('bd_id'=>'1','money'=>100000); //将primarykey的b_id写错,执行不成功,会出现错误提示,发现a中并没有插入数据,虽然
    $rowa=array('a_id'=>'1','money'=>1000000); $a->update($rowa);这些语句已经执行,但最终没要运行到提交,所以数据库中的数据并没有变
5.数据库结构
CREATE TABLE `a` (
   `a_id` int(11) NOT NULL auto_increment,
   `money` int(11) NOT NULL,
   PRIMARY KEY   (`a_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=2 ;

INSERT INTO `a` (`a_id`, `money`) VALUES
(1, 100);


CREATE TABLE `b` (
   `b_id` int(11) NOT NULL auto_increment,
   `money` int(11) NOT NULL,
   PRIMARY KEY   (`b_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=2 ;

INSERT INTO `b` (`b_id`, `money`) VALUES
(1, 100);

4。测试代码

<?php
error_reporting(E_ALL);
//引入fleaphp类
require_once('FLEA/FLEA.php');
//定义cache
FLEA::setAppinf('internalCacheDir',dirname(__FILE__).'/Cache');

//定义数据库连接参数
$dbDSN=array(
'driver'=>'mysqlt',   //为了启用事务,这里的driver要为mysqlt
'host'=>'127.0.0.1',
'login'=>'root',
'password'=>'123456',
'database'=>'test'
);
FLEA::setAppinf('dbDSN',$dbDSN);
FLEA::init();
FLEA::loadClass('FLEA_Db_TableDataGateway');
class Table_a extends FLEA_Db_TableDataGateway
{
var $tableName='a';
var $primaryKey='a_id';
}
class Table_b extends FLEA_Db_TableDataGateway
{
var $tableName='b';
var $primaryKey='b_id';
}

$a=FLEA::getSingleton('Table_a');
$b=FLEA::getSingleton('Table_b');
//得到数据库访问对象
$dbo=FLEA::getDBO();
//开始事务
$dbo->startTrans();
//修改表,让a表中的money-30,b表中的money+30,两者同时发生或不发生
$rowa=array(
       'a_id'=>'1',
    'money'=>70);
$a->update($rowa);
$rowb=array(
       'b_id'=>'1',
    'money'=>130);
$b->update($rowb);
//如果提交了,这里出现的结果与下边的一致,如果回滚两者会不一致,这里的结果与最后的结果是否一样,取决于事物是否提交
//具体应用时,应该判断是否都成功执行。
$rowa=$a->findAll();
dump($rowa);
$rowb=$b->findAll();
dump($rowb);
//$dbo->completeTrans();//如果两个操作都成功,提交
$dbo->completeTrans(false); //否则滚回,具体提交还是滚回,需要你加判断

//用于查看事务最终有没有提交.如果提交了会和上边的输出一样
$rowa=$a->findAll();
dump($rowa);
$rowb=$b->findAll();
dump($rowb);
?>
空间出租:P4 3.0+1G+RIAD 1 160G+PHP+IIS+MYSQL+MDaemon

QQ:126682182
Email:hhyisw@163.com
Home:http://www.stksky.com

TOP

发新话题