이 글은 PHP 트랜잭션의 구현 방법(코드 예제)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
<?php $db = new mysqli("localhost","root","","test"); //连接数据库 $db->autocommit(false); //设置为非自动提交——事务处理 $sql1 = "INSERT INTO `test`.`test1` (`name` )VALUES ('1' )"; $result1 = $db->query($sql1); $sql2 = "INSERT INTO `test`.`test2` (`a` )VALUES ('1')"; $result2 = $db->query($sql2); if ($result1 && $result2) { $db->commit(); //全部成功,提交执行结果 echo '提交'; } else { $db->rollback(); //有任何错误发生,回滚并取消执行结果 echo '回滚'; } $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이 트랜잭션을 지원하도록 하려면 직접 수동으로 수정할 수 있습니다.
방법은 다음과 같습니다.
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('localhost','root','root') or die ("数据连接错误!!!"); mysql_select_db('test',$conn); mysql_query("set names 'GBK'"); //使用GBK中文编码; //开始一个事务 mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION"); $sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')"; $sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条我故意写错 $res = mysql_query($sql); $res1 = mysql_query($sql2); if($res && $res1){ mysql_query("COMMIT"); echo '提交成功。'; }else{ mysql_query("ROLLBACK"); echo '数据回滚。'; } mysql_query("END");
/**************** transaction--2 *******************/ /*方法二*/ mysql_query("SET AUTOCOMMIT=0"); //设置mysql不自动提交,需自行用commit语句提交 $sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')"; $sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条我故意写错 $res = mysql_query($sql); $res1 = mysql_query($sql2); if($res && $res1){ mysql_query("COMMIT"); echo '提交成功。'; }else{ mysql_query("ROLLBACK"); echo '数据回滚。'; } 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, 'test1', '0')"; $res = mysql_query($sql); if($res){ echo '提交成功。!'; }else{ echo '失败!'; } mysql_query("UNLOCK TABLES");//解除锁定
위 내용은 PHP 트랜잭션 구현 방법 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!