现在需要在项目中自定义自增主键字段,格式如下:
主键字段=月(2位)+日(2月)+时(2位)+分(2位)+自增数(4位)
如果超出4位系统直接抛错处理。
同时模拟数据库多个更新操作(这里以count+1示例)。
由于自定义操作可能造成主键冲突,所以需要开启ZF的事务管理。
代码如下:
<?php
//测试控制器
class TestController extends Bonjour_Controller_Base{
public function init(){
}
//事务测试2
public function test6Action(){
$this->_helper->viewRenderer->setNoRender ( true );
header ( 'content-type:text/html;charset=utf-8' );
$db=Bonjour_Core_Db_Connection::getConnection('master');
if($db == null){
$this->_redirect('error/db-disconnect');
return;
}
sleep(intval(rand(2, 5))); //延时测试1
echo 'step1<br/>';
$db->beginTransaction();
try{
sleep(intval(rand(1, 3))); //延时测试2
echo 'step2<br/>';
$minute=strval(date('mdHi'));
$maxCode=1;
$query="select max(substr(userCode,9,4)) maxCode from bonjour_test where substr(userCode,1,8)=?";
$result=$db->query($query,$minute)->fetch();
sleep(intval(rand(1, 3))); //延时测试3
echo 'step3<br/>';
if($result->maxCode != null){
$maxCode=intval($result->maxCode)+1;
}
//编码补零
$maxCode=sprintf('%04d',$maxCode);
//操作1
$user=array('userName'=>'test'.date('YmdHis'),'userCode'=>$minute.$maxCode);
$row1=$db->insert('bonjour_test',$user);
if($row1>0){
sleep(intval(rand(1, 3))); //延时测试4
echo 'step4<br/>';
//操作2
$query="update bonjour_test2 set currentNumber=currentNumber+1 where counterName=?";
$row2=$db->query($query,'counter1');
}
$db->commit();
echo 'db commit success<br/>';
}catch(Exception $ex){
$db->rollBack();
echo 'db rollback<br/>';
}
}
}
?>