事务处理的问题

wasuka 2007-12-13 04:13:48
现有三个文件:db.php、a.php、b.php;内容如下:

db.php:

<?php
class db
{
var $RID;

function db()
{
$this->RID = mysql_connect("", "root", "");
mysql_select_db("dbname");
}


function query($q)
{
mysql_query($q, $this->RID);
}
}
?>


a.php:

<?php
require_once "db.php";
class a extends db
{
function a()
{
parent::db();
}

function i()
{
$this->query("begin");
$this->query("insert into a set ID=1");
require_once "b.php";
$b = new b();
if(!$b->i())
{
$this->query("rollback");
return false;
}
$this->query("commit");
}
}
?>


b.php:

<?php
require_once "db.php";
class b extends db
{
function b()
{
parent::db();
}

function i()
{
$this->query("begin");
$this->query("rollback");
return false;
}
}
?>


表a是InnoDB类型。

执行代码

<?php
require "a.php";
$a = new a();
var_dump($a->i());
?>

后,结果是“bool(false)”,但是表a内已经插入数据了,rollback失败。
我的本意是b类的返回值决定a类中的事务是提交还是回滚,但b类中一旦执行begin语句,a类中的事务就会自动commit。
如果b类中的方法i()没有begin语句、直接return false,那么a类中的方法i()会成功rollback,数据不会插入。


请教:如何使b类中的事务处理语句不影响a类?
...全文
136 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SysTem128 2007-12-14
  • 打赏
  • 举报
回复
<?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();
?>
wasuka 2007-12-14
  • 打赏
  • 举报
回复
汗,用错ID了。
楼上也是我
PriestZealot 2007-12-14
  • 打赏
  • 举报
回复
谢谢楼上的回复。

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

你的方法我看了下,本质上还是没有解决问题,只不过begin挪到了b类中
怡天网 2007-12-14
  • 打赏
  • 举报
回复
要么是类包含有问题,要么是事务不支持欠套.QQ上给你讲了,现在在来收点分,要不贴子都发不起咯
wasuka 2007-12-14
  • 打赏
  • 举报
回复
谢谢,我测试一下
SysTem128 2007-12-13
  • 打赏
  • 举报
回复
<?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");
不应再次启动.
直接回滚即可.
SysTem128 2007-12-13
  • 打赏
  • 举报
回复
没这样使用过.
一般放在一个对象内.
如下所述.
<?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();
?>


再帮你测试下你的想法.

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧