ZF项目下自定义自增字段保证事务安全的代码演示

现在需要在项目中自定义自增主键字段,格式如下:

主键字段=月(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/>';
		}
	}
	
}

?>


 

经测试,冲突后将抛错后回滚,现实生产环境可以提示“系统繁忙”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值