没这样使用过.
一般放在一个对象内.
如下所述.
<?php
abstract class db
{
public $RID; public function db()
{
$this->RID = mysql_connect("localhost", "root", "yourpsw");
mysql_select_db("test");
}
public function query($q)
{
return mysql_query($q, $this->RID);
}
}class a extends db
{
public function __construct()
{
parent::db();
}
public function i()
{
$this->myBegin();
$isSuc = $this->query("insert into a (id,body)values(null,'heihei')");
if(!$isSuc) #可以在这里改变条件来测试rollback是否正常运行;
{
$this->myRollback();
return false;
}
$this->myCommit();
return true;
} public function myRollback()
{ return $this->query("rollback"); }
public function myBegin()
{
return $this->query("begin");
}
public function myCommit()
{
return $this->query("commit");
}
}
$db = new a();
echo $db->i();
?>
再帮你测试下你的想法.

解决方案 »

  1.   

    <?php
    abstract class db
    {
    public $RID; public function db()
    {
    $this->RID = mysql_connect("localhost", "root", "a205a205");
    mysql_select_db("test");
    }
    public function query($q)
    {
    return mysql_query($q, $this->RID);
    }
    }
    class b extends db
    {
    public function myRollback()
    { return $this->query("rollback"); }
    public function myBegin()
    {
    return $this->query("begin");
    }
    public function myCommit()
    {
    return $this->query("commit");
    }
    }
    class a extends db
    {
    public function __construct()
    {
    parent::db();
    }
    public function i()
    {
    $bDb = new b();
    $bDb->myBegin();
    $isSuc = $this->query("insert into a (id,body)values(null,'111111')");
    if(!$isSuc) #可以在这里改变条件来测试rollback是否正常运行;
    {
    $bDb->myRollback();
    return false;
    }
    $bDb->myCommit();# 正常情况下去掉此行则数据插入无效.证明事务正常启动.
    return true;
    }
    }$db = new a();
    echo $db->i();
    ?>
    测试是可用的.你的错误在于# 类 b
    $this->query("begin");
    不应再次启动.
    直接回滚即可.
      

  2.   

    谢谢楼上的回复。我举的这个例子是一个简化版,现在的$b->i()是一个被引用的方法,实际情况中它有可能是被直接使用的,而且还会引用$c->i(),所以$b中必须有单独的事务。
      

  3.   

    <?php
    abstract class db
    {
    public $RID; public function db()
    {
    $this->RID = mysql_connect("localhost", "root", "123456");
    mysql_select_db("test");
    }
    public function query($q)
    {
    return mysql_query($q, $this->RID);
    }
    }
    class b extends db
    {
    public function __construct()
    {
    parent::db();
    }
    public function myRollback()
    {
    return $this->query("rollback"); }
    public function myBegin()
    {
    return $this->query("begin");
    }
    public function myCommit()
    {
    return $this->query("commit");
    }
    public function i()
    {
    $this->myBegin();
    $isSuc = $this->query("insert into a (id,body)values(null,'33')");
    if(!$isSuc)    #可以在这里改变条件来测试rollback是否正常运行;
    {
    $this->myRollback();
    return false;
    }
    $this->myCommit();# 正常情况下去掉此行则数据插入无效.证明事务正常启动.
    return true;
    }
    }
    class a extends db
    {
    public function __construct()
    {
    parent::db();
    }
    public function i()
    {
    $bDb = new b();
    $bDb->myBegin();
    $isSuc = $this->query("insert into a (id,body)values(null,'111111')");
    if(!$isSuc)    #可以在这里改变条件来测试rollback是否正常运行;
    {
    $bDb->myRollback();
    return false;
    }
    $bDb->myCommit();# 正常情况下去掉此行则数据插入无效.证明事务正常启动.
    return true;
    }
    }$dba = new a();
    $dbb = new b();
    //echo $dba->i();
    echo $dbb->i();
    ?>
      

  4.   

    SysTem128:你的方法我看了下,本质上还是没有解决问题,只不过begin挪到了b类中