2026-05-29 19:54:56 +08:00

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();
}
}
}