트랜잭션은 4가지 조건(ACID)을 충족해야 합니다: 원자성(Autmic), 일관성(Consistency), 격리(Isolation), 지속성(Durability)
원자성(Autmic): 트랜잭션 실행 측면에서는 "하지 않거나 모두 수행하십시오!"를 달성하는 데 필요합니다. 이는 트랜잭션의 일부가 실행되는 것이 허용되지 않음을 의미합니다. 장애로 인해 트랜잭션을 완료할 수 없더라도 롤백 시 데이터베이스에 미치는 영향을 제거해야 합니다!
일관성: 트랜잭션 작업은 데이터베이스를 하나의 일관된 상태에서 다른 일관된 상태로 변환해야 합니다! 온라인 쇼핑을 예로 들어보겠습니다. 창고에서 상품을 꺼내고 고객의 장바구니에 입력해야만 비즈니스를 만들 수 있습니다.
격리: 여러 트랜잭션이 동시에 실행되는 경우 각 트랜잭션이 독립적으로 실행되는 것과 같아야 합니다!
내구성: 성공적으로 실행된 트랜잭션은 데이터베이스에 지속적인 영향을 미치며, 데이터베이스가 실패하고 오류가 발생하더라도 복구할 수 있어야 합니다.
MYSQL의 트랜잭션 처리 방식은 크게 두 가지가 있습니다.
1. 시작, 롤백 및 커밋을 사용하여 구현
트랜잭션 시작
트랜잭션 롤백
트랜잭션 확인 커밋
롤백과 커밋은 동시에 사용할 수 없습니다. 동시에 사용할 경우 전자만 유효하고 후자는 유효하지 않습니다. 즉, 커밋이나 롤백을 실행합니다
2. set을 직접 사용하여 mysql의 자동 제출 모드를 변경합니다.
MYSQL은 기본적으로 자동으로 제출됩니다. 즉, QUERY를 제출하면 실행됩니다!
자동 제출을 비활성화하려면
자동 제출을 비활성화하려면
자동 커밋을 1로 설정하고 자동 제출을 활성화하면
트랜잭션 처리를 구현할 수 있습니다.
set autocommit=0을 사용하면 커밋이나 롤백을 통해 확인할 때까지 모든 후속 SQL이 트랜잭션으로 처리됩니다. 이 트랜잭션을 종료하면 새 비즈니스도 열립니다. ! 첫 번째 방법에 따르면 현재의 것만 트랜잭션으로 사용됩니다!
MYSQL에서는 INNODB, BDB 유형의 데이터 테이블만 트랜잭션 처리를 지원할 수 있습니다! 다른 유형은 지원되지 않습니다!
***: 일반적으로 MYSQL 데이터베이스의 기본 엔진은 MyISAM입니다. 이 엔진은 트랜잭션을 지원하지 않습니다! MYSQL이 트랜잭션을 지원하도록 하려면 수동으로 수정하면 됩니다.
방법은 다음과 같습니다. 1. c:appservmysqlmy.ini 파일을 수정하고, Skip-InnoDB를 찾아 앞에 #을 추가한 후 파일을 저장합니다.
2. 작업 중에 services.msc를 입력하여 mysql 서비스를 다시 시작합니다.
3. phpmyadmin, mysql->showengines;로 이동하여(또는 'have_%';와 같은 mysql->show 변수 실행) InnoDB에서 YES를 확인합니다. 이는 데이터베이스가 InnoDB를 지원한다는 의미입니다.
즉, 거래 거래가 지원된다는 의미입니다.
4. 테이블 생성 시 스토리지 엔진으로 InnoDB 엔진을 선택할 수 있습니다. 이전에 생성된 테이블인 경우 mysql->alter table table_name type=InnoDB;
$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");
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 및 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");//解除锁定