>백엔드 개발 >PHP 튜토리얼 >PHP에서 PDO 트랜잭션 처리 작업의 예

PHP에서 PDO 트랜잭션 처리 작업의 예

不言
不言원래의
2018-05-02 16:40:122495검색

본 글은 주로 PHP에서의 PDO 트랜잭션 처리 연산을 소개하고, PDO를 이용한 MySQL 트랜잭션 처리 연산 단계, 구현 기법, 관련 주의사항 등을 예시 형태로 분석한 내용입니다. 기사에서는 PHP PDO 트랜잭션 처리 작업에 대해 설명합니다. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

요약: 여러 SQL 작업(추가, 삭제, 수정)을 하나의 작업 단위로 처리하여 모두 성공하거나 모두 실패합니다.

단일 데이터에는 트랜잭션 처리가 필요하지 않습니다.

운영되는 테이블은 innoDB형 테이블이어야 합니다(트랜잭션 지원).

MySQL에서 자주 사용하는 테이블 유형: MyISAM(비트랜잭션)은 추가, 삭제, 수정이 빠릅니다. , InnodB(트랜잭션)는 보안성이 높습니다

테이블 유형을 innoDB 유형으로 변경

mysql> alter table stu engine=innodb;

사용: PDO 전처리를 기반으로 다음 형식을 추가합니다.

try{
$m->beginTransaction();//开启事务处理
//PDO预处理以及执行语句...
$m->commit();//提交事务
}catch(PDOException $e){
$m->rollBack();//事务回滚
//相关错误处理
}

예:

$m = new PDO($dsn,$user,$pwd);
$m->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
try{
$m->beginTransaction();//开启事务处理
$stmt=$m->prepare("insert into stu(name,sex,age,classid)values(?,?,?,?)");
$data=array(
array("user1",1,22,"lamp76"),
array("user2",1,20,"lamp76"),
array("user3",0,22,"lamp76")
);
foreach($data as $v){
$stmt->execute($v);
echo $m->lastInsertId();
}
$m->commit();
echo "提交成功!";
}catch(PDOException $e){
$m->rollBack();//回滚
die("提交失败!");
}

보충: PDO

개요:

트랜잭션은 일련의 쿼리 및/또는 업데이트 문으로 구성됩니다. 트랜잭션을 시작하려면 시작, 트랜잭션 시작

을 사용하고, 트랜잭션을 롤백하려면 롤백하고, 트랜잭션을 커밋하려면 커밋을 사용하세요. 트랜잭션을 시작한 후에는 여러 개의 SQL 쿼리나 업데이트 문이 있을 수 있으며, 각 SQL이 실행을 위해 제출된 후에는 모두 실행되었는지 확인하기 위해 다음 단계에서 롤백할지 여부를 결정하는 문도 있어야 합니다. 올바르게 실행되면 최종적으로 제출됩니다.

트랜잭션이 롤백되면 데이터베이스는 트랜잭션이 시작되기 전의 상태로 유지됩니다. 편집한 파일을 저장하지 않고 종료하는 것처럼 자연스럽게 파일의 원래 모습이 유지됩니다.
따라서 트랜잭션은 원자성 작업으로 간주될 수 있으며 트랜잭션의 SQL은 완전히 실행되거나 전혀 실행되지 않습니다.


PDO의 MYSQL 트랜잭션 처리 단계:

Ⅰ. 자동 제출을 끕니다.

②. 트랜잭션 처리를 켭니다. 예외가 있는 경우 자동으로 예외 프롬프트가 발생하고 롤백됩니다. . 자동 제출 켜기

참고:

mysql은 트랜잭션 처리를 지원하는 유일한 InnoDB 드라이버입니다.

예:

<?php
try{
//最后是关闭自动提交
$pdo=new pdo("mysql:host=localhost;dbname=mydb","root","root", array(PDO::ATTR_AUTOCOMMIT=>0));
//这个是通过设置属性方法进行关闭自动提交和上面的功能一样
//$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
//开启异常处理
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo "数据库连接失败:".$e->getMessage();
exit;
}
/*
* 事务处理
*
* 张三从李四那里买了一台 2000 元的电脑
* 从张三帐号中扣出 2000元
* 向李四账号中加入 2000元
* 从商品表中减少一台电脑
* MyIsAM InnoDB
*/
try{
$pdo->beginTransaction();//开启事务处理
$price=500;
$sql="update zhanghao set price=price-{$price} where id=1";
$affected_rows=$pdo->exec($sql);
if(!$affected_rows)
throw new PDOException("张三转出失败");//那个错误抛出异常
$sql="update zhanghao set price=price+{$price} where id=3";
$affected_rows=$pdo->exec($sql);
if(!$affected_rows)
throw new PDOException("向李四转入失败");
echo "交易成功!";
$pdo->commit();//交易成功就提交
}catch(PDOException $e){
echo $e->getMessage();
$pdo->rollback();
}
//自动提交,如果最后不自动提交,转账是不成功的
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
//设置错误报告模式 ERRMODE_SILENT ERRMODE_WARNING

관련 권장 사항:

php에서 보호되는 것에 대한 생각

PHP PDO가 하나의 데이터를 삽입하고 두 개의 데이터가 반복적으로 나타나는 상황에 대한 솔루션

위 내용은 PHP에서 PDO 트랜잭션 처리 작업의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.