多表执行时几个函数的使用问题

#1 zhijiangch

  一、事务情况
如果对单个表执行修改,删除操作可以:
$tb = spClass("table");
$tb->query("START TRANSACTION");
//简写
$tb->update();  
$tb->delete();
if(true){
  $tb->query("COMMIT");
}else{
  $tb->query("ROLLBACK");       
}


那么多表的情况该怎么写,随便实例化一个表吗?还是下面的情况
mysql_query("START TRANSACTION");
$tb1 = spClass("table1");
...... //$tb1的操作
$tb2 = spClass("table2");
......
$tb3 = spClass("table3");
......
if(true)){
   mysql_query("COMMIT");                               
}else{
   mysql_query("ROLLBACK");       
}


如果随便实例话一个表即可操作,这里面就需要规范一下。要不需要重新创建形如mDB的model,这个类可以操作所有的表,只是在操作时传一个表的值,初始化:
$db = new mDB()
$db->query("START TRANSACTION");
$db->find($table1,$condtions);
$db->find($table2,$condtions);
$db->findAll($table3,$condtions);
这样看着是不是更规范。


在手册第六部分 数据模型 2.使用SQL一节中,对findSql的介绍很有趣
$obj->finSql(...);
$obj用的好,避开了问题,怎么来的没有说明

类似的问题还包括findSql,runSql等函数

2015-10-26 21:05:22

#2 jake

多表也是用事务,model的db示例只有一个,所以问题不大

不过一般涉及到这种复杂的逻辑(要用到事务),最好是写存储过程来实现。

2015-10-26 22:23:12

#3 zhijiangch

事务处理中间解决方案:
1.创建一个连接数据库的model
class mConn extends spModel
{
  
  public function __construct()
  {   
     //连接其它数据库
     //$GLOBALS['G_SP']['db']['database'] = $new_database;           
     parent::__construct();
  }
}
2.代码
$obj= spClass("mConn");
$obj->query("START TRANSACTION");
//执行数据表操作1
//执行数据表操作2
...
if(true)){
  $obj->query("COMMIT");                              
}else{
   $obj->query("ROLLBACK");  
}

2015-10-29 15:03:59

#4 zhijiangch

jake 发表于 2015-10-26 22:23
多表也是用事务,model的db示例只有一个,所以问题不大

不过一般涉及到这种复杂的逻辑(要用到事务),最 ...
存储过程更好些,执行效率更高

2015-10-29 15:07:12