Yii 2 에서 의 업무 사용 실례 코드 상세 설명
일반적으로 우 리 는 업무 논 리 를 할 때 하나의 데이터 시트 만 관련 되 지 않 기 때문에 업무 문제 에 직면 할 수 있다.
데이터베이스 트 랜 잭 션(Database Transaction)은 하나의 논리 작업 단위 로 실행 되 는 일련의 작업 을 말한다.완전히 실행 하거나 완전히 실행 하지 않 는 다.트 랜 잭 션 처 리 는 트 랜 잭 션 유닛 내 모든 작업 이 성공 적 으로 이 루어 지지 않 는 한 데이터 에 대한 자원 을 영구적 으로 업데이트 하지 않도록 확보 할 수 있 습 니 다.관련 작업 을 모두 성공 하거나 실패 한 단원 으로 조합 하면 오류 복 구 를 간소화 하고 응용 프로그램 을 더욱 신뢰 할 수 있 습 니 다.하나의 논리 적 작업 단원 이 업무 가 되 려 면 이른바 ACID(원자 성,일치 성,격 리 성과 지속 성)속성 을 만족 시 켜 야 한다.사 무 는 데이터베이스 가 실행 중인 논리 적 인 작업 단위 로 DBMS 의 사무 관리 서브 시스템 에서 사 무 를 처리한다.
준비 하 다.
데이터베이스 엔진 은 innodb 입 니 다.
본 논문 에서 사용 하 는 yii 버 전 은 2.0.5 로 2.0 이상 이면 문제 가 없다.
실행 환경 은 PHP 7.0.0,Mysql 5.6 입 니 다.
Yii 의 사무
처리 이상
/**
*
*/
public function actionTest(){
//
$tr = Yii::$app->db->beginTransaction();
try {
for($i=1;$i<=3;$i++){
$test = new Areas();
$test->name = 'name'.$i;
$test->sort=1;
if($test->save()){
echo "save $i | ";
}
}
$test = new Areas();
$test->name = 'ab'.$i;
$test->sorta=1; //
if(!$test->save()){
"save fail"; //
}
//
$tr->commit();
} catch (Exception $e) {
//
$tr->rollBack();
echo "rollback";
}
}
실행 결과
save 1 | save 2 | save 3 | rollback
마지막 데이터 가 삽입 되 지 않 았 기 때문에 트 랜 잭 션 의 스크롤 백 을 실 행 했 기 때문에 데이터 시트 에 데이터 가 추가 되 지 않 았 습 니 다.트 랜 잭 션 스크롤 백 을 실행 하 는 이 유 는 코드 에 이상 이 생 겼 기 때 문 입 니 다(Exception).
데이터 처리 실패
일반적으로 우리 가 실행 중인 코드 는 이런 뚜렷 한 이상 이 나타 나 지 않 고 이런 이상 은 개발 테스트 과정 에서 사라 질 것 이다.
진정 으로 데 이 터 를 스크롤 백 해 야 하 는 것 은 우리 의 특정한 업무 에 문제 가 생 겨 서 일부 데 이 터 를 기록 하지 못 한 것 이다.
/**
*
*/
public function actionTest(){
//
$tr = Yii::$app->db->beginTransaction();
try {
for($i=1;$i<=3;$i++){
$test = new Areas();
$test->name = 'name'.$i;
$test->sort=1;
if($test->save()){
echo "save $i | ";
}
}
$test = new Areas();
$test->name = null; // name , 。
$test->sort=1; //
if(!$test->save()){
echo "save fail"; //
}
//
$tr->commit();
} catch (Exception $e) {
//
$tr->rollBack();
echo "rollback";
}
}
실행 결 과 는 다음 과 같 습 니 다.데이터 베 이 스 는 세 개의 데 이 터 를 삽입 하 였 습 니 다.
save 1 | save 2 | save 3 | save fail
업무 논리 로 인해 어떤 데이터 시트 가 데 이 터 를 쓰 지 않 았 고 해당 하 는 스크롤 백 도 나타 나 지 않 았 다 는 것 이다.개선 방안 은 다음 과 같다.
/**
*
*/
public function actionTest(){
//
$tr = Yii::$app->db->beginTransaction();
try {
for($i=1;$i<=3;$i++){
$test = new Areas();
$test->name = 'name'.$i;
$test->sort=1;
if($test->save()){
echo "save $i | ";
}
}
$test = new Areas();
$test->name = null; // name , 。
$test->sort=1; //
if(!$test->save()){
throw new \yii\db\Exception(); // , 。
}
//
$tr->commit();
} catch (Exception $e) {
//
$tr->rollBack();
echo "rollback";
}
}
실행 결 과 는 다음 과 같 습 니 다.데이터 베 이 스 는 새 데 이 터 를 삽입 하지 않 았 고 트 랜 잭 션 은 스크롤 백 되 었 습 니 다.
save 1 | save 2 | save 3 | rollback
분 산 된 데이터 처리실제 프로젝트 의 복잡 한 정도 로 인해 우리 의 데이터 베이스 작업 은 서로 다른 Model 에 분산 되 었 다.
그래서 실제 프로젝트 의 코드 는 위의 모습 이 아 닙 니 다.
아 날로 그 수요
수신 인자:
이름.
성별.
서명 하 다.
업무 처리 절차:
수신 매개 변수
호출기 에서 사용자 의 uid 를 얻 고 호출기 에 대응 하 는 데이터 시트 에 숫자 를 추가 합 니 다.
이름,성별,서명,이전 uid 를 사용자 정보 표 에 기록 합 니 다.
사용자 잔액 표 초기 화
스크롤 백 시전 시기:
초기 화 잔액 표 가 uid 로 전송 되 지 않 았 습 니 다.기록 되 지 않 은 데 이 터 를 내 보 냅 니 다.
실제 코드
//Controller
/**
* -
*/
public function actionReg()
{
//
$request = Yii::$app->request;
//
$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_JSON; // json
// ,
$name = $request->get("name");
$gender = $request->get("gender");
$sign = $request->get("sign");
// ,
$tr = Yii::$app->db->beginTransaction();
try {
// uid
$uid = App::getSeNo();
UserProfile::add($uid, $name, $gender, 1, $sign);
$user_balance = UserBalance::initUserBalance($uid);
$tr->commit(); //
} catch (Exception $e) {
//
$tr->rollBack();
return $e->getMessage(); //
}
return $user_balance;
}
//UserProfile
/**
*
* @param $user_id
* @param $nikename
* @param $gender
* @param $user_type
* @param string $intro
* @return UserProfile
* @throws \Exception
*/
public static function add($user_id, $nikename, $gender,$user_type,$intro="") {
$model = new UserProfile();
$model->gender = $gender;
$model->nikename = $nikename;
$model->user_id = $user_id;
$model->user_type=$user_type;
$model->intro=$intro;
$model->update_time = time();
$insert =$model->insert();
if(!$insert){
throw new Exception(" ");
}
return $model;
}
//UserBalance
/**
*
* @param $user_id
*/
public static function initUserBalance($user_id){
$info=self::find()->where(['user_id'=>$user_id])->one();
if(!$info ){
$model=new UserBalance();
$model->user_id = $user_id;
$model->price= "0";
$model->update_time=time();
$insert = $model->insert();
if(!$insert){
throw new Exception(" ");
}
$info=$model;
}
return $info->attributes;
}
정상 적 인 결 과 는 다음 과 같다.
{"id":124,"user_id":1473179883,"price":"0","update_time":1473179883}
사용자 잔액 부분 을 초기 화한 userid 가 전달 되 지 않 았 습 니 다.돌아 온 결 과 는 다음 과 같 습 니 다.
" "
우 리 는 구체 적 인 상황 에 대해 잘못된 위 치 를 정 하고 제때에 수정 할 수 있다.사무(거래)
위 에 있 는 실제 코드 를 보면 트 랜 잭 션 을 만 들 었 고,범위 내 에서 도 입 된 다른 모델 이라도 이상 NG 를 되 돌려 스크롤 백 작업 을 완료 할 수 있 음 을 알 수 있다.
일반적인 상황 에서 전체 Yii 응용 은 같은 데이터 베 이 스 를 사용 하거나 하나의 예 를 사용 했다.
yii\db\Connection 에 서 는 트 랜 잭 션 대상 을 캐 시 했 습 니 다.
class Connection extends Component
{
// Transaction
private $_transaction;
// , ,
// null
public function getTransaction()
{
return $this->_transaction && $this->_transaction->getIsActive() ? $this->_transaction : null;
}
// ,
public function beginTransaction($isolationLevel = null)
{
$this->open();
// ,
//
if (($transaction = $this->getTransaction()) === null) {
$transaction = $this->_transaction = new Transaction(['db' => $this]);
}
$transaction->begin($isolationLevel);
return $transaction;
}
}
따라서 전체 Yii 응용 프로그램 이 같은 Transaction 대상 을 사용 했다 고 볼 수 있다.즉,Transaction::level 은 전체 응용의 생명주기 에서 지속 성 이 있다.이것 은 사무 내장 을 실현 하 는 관건 과 전제 이다.위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Yii 2 의 업무 사용 실례 코드 입 니 다.여러분 께 도움 이 되 셨 으 면 합 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Yii2.0 rules 검증 규칙 집합required: 필수 값 검증 속성 이메일: 메일박스 인증 match: 정규 검증 URL: 사이트 주소 captcha: 인증 코드 안전 비교: 비교 default: 기본값 exist:존재 파일:파일 filter:필...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.