82 lines
1.9 KiB
PHP
82 lines
1.9 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: zn
|
|
* Date: 2017/7/20
|
|
* Time: 14:20
|
|
*/
|
|
|
|
namespace common\modules\safe;
|
|
|
|
|
|
use common\services\ResultStatusServices;
|
|
use common\services\StatusException;
|
|
use RedisLock\RedisLock;
|
|
use Yii;
|
|
use yii\base\Exception;
|
|
|
|
/**
|
|
* 安全操作
|
|
* Class SafeUtil
|
|
* @package common\utils
|
|
*/
|
|
class SafeUtil
|
|
{
|
|
/**
|
|
* 数据库事务安全操作
|
|
* @param callable $pFunc 要执行的方法
|
|
* @param array $pParams
|
|
* @return mixed
|
|
* @throws Exception
|
|
*/
|
|
public static function dbOperate($pFunc, $pParams)
|
|
{
|
|
//开启事务
|
|
$dbTrans = Yii::$app->db->beginTransaction();
|
|
|
|
try {
|
|
|
|
$r = call_user_func_array($pFunc, $pParams);
|
|
$success = true;
|
|
|
|
return $r;
|
|
|
|
} catch (Exception $e) {
|
|
throw $e;
|
|
} finally {
|
|
if (isset($success))
|
|
$dbTrans->commit();
|
|
else {
|
|
$dbTrans->rollBack();
|
|
|
|
//清除脏缓存数据
|
|
Yii::$app->redis->clearDirtyKey();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* redis加锁操作
|
|
* @param callable $pFunc
|
|
* @param array $pParams
|
|
* @param string $pLockKey
|
|
* @param int $pWaitTime
|
|
* @return mixed
|
|
* @throws StatusException
|
|
*/
|
|
public static function redisLockOperate($pFunc, $pParams, $pLockKey, $pWaitTime = 10)
|
|
{
|
|
if (empty($pLockKey)) throw new StatusException(ResultStatusServices::RS_REDIS_LOCK_KEY_EMPTY);
|
|
|
|
//加锁
|
|
$redisLock = new RedisLock(Yii::$app->redis, $pLockKey, RedisLock::FLAG_CATCH_EXCEPTIONS);
|
|
if (!$redisLock->acquire($pWaitTime)) throw new StatusException(ResultStatusServices::RS_SAME_TIME_OPERATION);
|
|
|
|
try {
|
|
return call_user_func_array($pFunc, $pParams);
|
|
} finally {
|
|
//解锁
|
|
$redisLock->release();
|
|
}
|
|
}
|
|
} |