>  기사  >  백엔드 개발  >  PHP에서 PDO 트랜잭션을 사용하는 단계에 대한 자세한 설명

PHP에서 PDO 트랜잭션을 사용하는 단계에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-05-16 11:16:071518검색

이번에는 PHP에서 PDO 트랜잭션을 사용하는 단계에 대해 자세히 설명하겠습니다. 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 트랜잭션 처리 단계:

①. 자동 제출을 끄고

② 트랜잭션 처리를 켭니다. 예외가 있으면 자동으로

예외를 발생시키고

롤백합니다.

4. 자동 제출을 켜세요

참고:

mysql 이 InnoDB 드라이버만 트랜잭션 처리를 지원하며 기본 MyIsAM 드라이버는 이를 지원하지 않습니다.

예:

<?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는 컬을 사용하여 IP를 복사하고 자세히 참조합니다.

PHP+MySQL은 메시지 대기열을 자세히 구현합니다

위 내용은 PHP에서 PDO 트랜잭션을 사용하는 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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