>  기사  >  백엔드 개발  >  PHP 트랜잭션 구현 방법 소개(코드 예)

PHP 트랜잭션 구현 방법 소개(코드 예)

不言
不言앞으로
2019-02-20 11:33:102858검색

이 글은 PHP 트랜잭션의 구현 방법(코드 예제)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

<?php
$db = new mysqli("localhost","root","","test"); //连接数据库
$db->autocommit(false); //设置为非自动提交——事务处理
$sql1  = "INSERT INTO `test`.`test1` (`name` )VALUES (&#39;1&#39; )";
$result1 = $db->query($sql1);
$sql2  = "INSERT INTO `test`.`test2` (`a` )VALUES (&#39;1&#39;)";
$result2 = $db->query($sql2);
if ($result1 && $result2) {
$db->commit();  //全部成功,提交执行结果
echo &#39;提交&#39;;
} else {
$db->rollback(); //有任何错误发生,回滚并取消执行结果
echo &#39;回滚&#39;;
}
$db->autocommit(true); //设置为非自动提交——事务处理
$db->close();
?>

MYSQL의 트랜잭션 처리에는 두 가지 주요 방법이 있습니다.

1. 시작, 롤백 및 커밋을 사용하여
begin 트랜잭션 시작
롤백 트랜잭션 롤백
커밋 트랜잭션 확인 # 🎜🎜#
2. mysql의 자동 제출 모드를 변경하려면 set을 직접 사용하세요MYSQL은 기본적으로 자동으로 제출합니다. 즉, QUERY를 제출하면 바로 실행됩니다!
set autocommit=0으로 트랜잭션 처리를 구현하여 자동 제출을 비활성화하고
set autocommit=1 자동 제출을 활성화
할 수 있습니다.
set autocommit=0을 사용하면 커밋이나 롤백을 확인할 때까지 모든 후속 SQL이 트랜잭션으로 처리됩니다.
이 거래를 종료하면 새로운 거래도 시작된다는 점에 유의하세요! 첫 번째 방법에 따르면 현재의 것만 트랜잭션으로 사용됩니다!
개인적으로는 첫번째 방법을 추천드려요!
MYSQL에서는 INNODB, BDB 유형의 데이터 테이블만 트랜잭션 처리를 지원할 수 있습니다! 다른 유형은 지원되지 않습니다!
***: 일반적으로 MYSQL 데이터베이스의 기본 엔진은 MyISAM입니다. 이 엔진은 트랜잭션을 지원하지 않습니다! MYSQL이 트랜잭션을 지원하도록 하려면 직접 수동으로 수정할 수 있습니다.
방법은 다음과 같습니다.

1 c:appservmysqlmy.ini 파일을 수정하고, Skip-InnoDB를 찾아 추가합니다. # 앞에, 문서를 저장합니다.

2. mysql 서비스를 다시 시작하려면 작업 중에 services.msc를 입력하세요.
3. phpmyadmin, mysql->showengines로 이동(또는 'have_%';와 같은 mysql->show 변수 실행)하고 InnoDB에서 YES를 확인하세요. 이는 데이터베이스가 InnoDB를 지원한다는 뜻입니다.
트랜잭션이 지원된다는 의미입니다.
4. 테이블 생성 시 스토리지 엔진으로 InnoDB 엔진을 선택할 수 있습니다. 이전에 생성된 테이블인 경우 mysql->alter table table_name type=InnoDB;
또는 mysql->alter table table_nameengine=InnoDB;를 사용하여 데이터 테이블의 엔진을 트랜잭션을 지원하도록 변경할 수 있습니다.
*/

/*************** transaction--1 ***************/
$conn = mysql_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;) or die ("数据连接错误!!!");
mysql_select_db(&#39;test&#39;,$conn);
mysql_query("set names &#39;GBK&#39;"); //使用GBK中文编码;
//开始一个事务
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2); 
if($res && $res1){
mysql_query("COMMIT");
echo &#39;提交成功。&#39;;
}else{
mysql_query("ROLLBACK");
echo &#39;数据回滚。&#39;;
}
mysql_query("END");
/**************** transaction--2 *******************/
/*方法二*/
mysql_query("SET AUTOCOMMIT=0"); //设置mysql不自动提交,需自行用commit语句提交
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2); 
if($res && $res1){
mysql_query("COMMIT");
echo &#39;提交成功。&#39;;
}else{
mysql_query("ROLLBACK");
echo &#39;数据回滚。&#39;;
}
mysql_query("END"); //事务处理完时别忘记mysql_query("SET AUTOCOMMIT=1");自动提交
/******************对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:********************/
//MyISAM & InnoDB 都支持,
/*
LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。
UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。
*/
mysql_query("LOCK TABLES `user` WRITE");//锁住`user`表
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, &#39;test1&#39;, &#39;0&#39;)";
$res = mysql_query($sql);
if($res){
echo &#39;提交成功。!&#39;;
}else{
echo &#39;失败!&#39;;
}
mysql_query("UNLOCK TABLES");//解除锁定


위 내용은 PHP 트랜잭션 구현 방법 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제