>백엔드 개발 >PHP 튜토리얼 >apache php mysql PHP 및 MYSQL 트랜잭션 처리

apache php mysql PHP 및 MYSQL 트랜잭션 처리

WBOY
WBOY원래의
2016-07-29 08:33:10815검색

/*
MYSQL의 트랜잭션 처리에는 크게 두 가지 방법이 있습니다.
1. 시작, 롤백 및 커밋을 사용하여
begin 시작 트랜잭션
롤백 트랜잭션 롤백
커밋 트랜잭션 확인
2. MySQL의 자동 제출 모드를 직접 변경하려면
MYSQL은 기본적으로 자동으로 제출됩니다. 즉, QUERY를 제출하면 바로 실행됩니다!
autocommit=0을 설정하여 자동 제출을 비활성화하고
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;를 사용하여 데이터 테이블의 엔진을 트랜잭션을 지원하도록 변경할 수 있습니다.
*/
/*************** 거래--1 ***************/
$conn = mysql_connect('localhost','root','root') 또는 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");
/**************** 거래--2 *******************/
/*방법 2*/
mysql_query("SET AUTOCOMMIT=0") / /mysql이 자동으로 제출되지 않도록 설정합니다. 커밋 문을 사용하여 직접 제출해야 합니다
$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");//잠금 해제

MyISAM은 MySQL의 기본 스토리지 엔진입니다. 일반적으로 이에 대해 관심을 갖는 사람은 많지 않습니다. 어떤 스토리지 엔진을 사용할지 결정하는 것은 매우 까다로운 일이지만, 이 기사에서는 MyISAM과 InnoDB만 고려합니다. 왜냐하면 이 두 가지가 가장 일반적이기 때문입니다. ​
먼저 몇 가지 질문에 답해 보겠습니다. ​
◆데이터베이스에 외래 키가 있습니까? ​
◆거래 지원이 필요하신가요? ​
◆전체 텍스트 색인이 필요합니까?
◆어떤 쿼리 모드를 자주 사용하시나요?
◆당신의 데이터는 얼마나 큽니까?
myisam에는 인덱스 캐시만 있습니다.
innodb는 인덱스 파일과 데이터 파일을 구분하지 않습니다.
myisam은 인덱스 데이터가 할당된 리소스보다 클 경우에만 인덱스를 관리할 수 있습니다. 시스템, 데이터 파일은 운영 체제 캐시에 따라 다릅니다. Innodb는 인덱스와 데이터를 모두 자체적으로 관리합니다.
위의 질문을 생각해보면 올바른 방향을 찾는 데 도움이 될 수 있지만 그것이 절대적인 것은 아닙니다. 트랜잭션 처리나 외래 키가 필요한 경우 InnoDB가 더 나은 방법일 수 있습니다. 전체 텍스트 인덱싱이 필요한 경우 MyISAM이 시스템에 내장되어 있기 때문에 일반적으로 좋은 선택입니다. 그러나 실제로 200만 행의 레코드를 자주 테스트하지는 않습니다. 따라서 조금 느리더라도 Sphinx를 사용하면 InnoDB에서 전체 텍스트 인덱스를 얻을 수 있습니다.
데이터 크기는 어떤 스토리지 엔진을 선택하는지에 영향을 미치는 중요한 요소입니다. 대용량 데이터 세트의 경우 트랜잭션 처리 및 장애 복구를 지원하기 때문에 InnoDB를 선택하는 경향이 있습니다. 데이터베이스 크기에 따라 오류 복구 시간이 결정됩니다. InnoDB는 데이터 복구를 위해 트랜잭션 로그를 사용할 수 있으며 이는 더 빠릅니다. MyISAM은 이러한 작업을 수행하는 데 몇 시간 또는 며칠이 걸릴 수 있지만 InnoDB는 몇 분 밖에 걸리지 않습니다.
데이터베이스 테이블을 조작하는 습관도 성능에 큰 영향을 미치는 요인이 될 수 있습니다. 예를 들어, COUNT()는 MyISAM 테이블에서는 매우 빠르지만 InnoDB 테이블에서는 어려울 수 있습니다. 기본 키 쿼리는 InnoDB에서 매우 빠르지만 기본 키가 너무 길면 성능 문제가 발생할 수도 있으므로 주의해야 합니다. 많은 수의 insert 문은 MyISAM에서 더 빠르지만 업데이트는 InnoDB에서 더 빠릅니다. 특히 동시성이 큰 경우에는 더욱 그렇습니다.
그럼 어떤 것을 사용해야 할까요? 경험에 따르면 소규모 애플리케이션이나 프로젝트인 경우 MyISAM이 더 적합할 수 있습니다. 물론 대규모 환경에서 MyISAM을 사용하는 것이 매우 성공적인 경우도 있지만 항상 그런 것은 아닙니다. 매우 큰 데이터 볼륨 프로젝트를 사용할 계획이고 트랜잭션 처리 또는 외래 키 지원이 필요한 경우 실제로 InnoDB를 직접 사용해야 합니다. 그러나 InnoDB 테이블에는 더 많은 메모리와 스토리지가 필요하며 100GB MyISAM 테이블을 InnoDB 테이블로 변환하면 매우 나쁜 경험을 제공할 수 있다는 점을 기억해야 합니다.
============================================= === ===========
MyISAM: 기본 유형입니다. ISAM은 Indexed Sequential Access Method의 약어입니다. 다른 스토리지 엔진과 비교하여 MyISAM은 테이블을 확인하고 복구하는 도구를 대부분 가지고 있습니다. MyISAM 테이블은 압축이 가능하며 전체 텍스트 검색을 지원하지 않습니다. 외래 키. 롤백되면 불완전한 롤백이 발생하고 원자성이 없습니다. 많은 수의 SELECT를 수행하는 경우 MyISAM이 더 나은 선택입니다.
InnoDB: 이 유형은 BDB 유형과 동일한 특성을 가지며 외래 키도 지원합니다. InnoDB 테이블은 BDB보다 더 풍부한 기능을 가지고 있으므로 트랜잭션에 안전한 스토리지 엔진이 필요합니다. , 데이터가 INSERT 또는 UPDATE를 많이 수행하는 경우 성능상의 이유로 InnoDB 테이블을 사용하는 것이 좋습니다.
이를 지원하는 InnoDB 유형 표준의 경우 속도에 영향을 미치는 주요 이유는 AUTOCOMMIT 기본 설정은 열려 있고 프로그램은 트랜잭션을 시작하기 위해 BEGIN을 명시적으로 호출하지 않으므로 삽입된 각 항목에 대해 자동 커밋이 발생하여 속도에 심각한 영향을 미칩니다. SQL을 실행하기 전에 start를 호출하면 여러 SQL이 하나의 트랜잭션을 형성하므로(자동 커밋이 설정된 경우에도) 성능이 크게 향상됩니다.
============================================= === ===============
InnoDB와 MyISAM은 MySQL을 사용할 때 가장 일반적으로 사용되는 두 가지 테이블 유형입니다. 각각은 특정 애플리케이션에 따라 고유한 장점과 단점을 가지고 있습니다. . 다음은 참조용으로만 둘 사이의 알려진 차이점입니다. 
innodb  
InnoDB는 MySQL에 트랜잭션(커밋), 롤백(롤백) 및 충돌 복구 기능을 갖춘 트랜잭션 안전(ACID 호환) 테이블을 제공합니다. InnoDB는 Oracle 유형과 일치하는 SELECT에서 행 잠금(행 수준 잠금) 및 비잠금 읽기를 제공합니다. 이러한 기능은 다중 사용자 동시 작업의 성능을 향상시킵니다. InnoDB의 행 수준 잠금은 매우 작은 공간에 적합하므로 InnoDB 테이블에서는 잠금 에스컬레이션이 필요하지 않습니다. InnoDB는 외래 키 제약 조건(FOREIGN KEY 제약 조건)을 제공하는 MySQL의 첫 번째 테이블 엔진입니다.
InnoDB는 대용량 데이터베이스 시스템을 처리하도록 설계되었으며 CPU 활용도는 다른 디스크 기반 관계형 데이터베이스 엔진과 비교할 수 없습니다. 기술적으로 InnoDB는 MySQL 배경에 배치된 완전한 데이터베이스 시스템입니다. InnoDB는 데이터 및 인덱스 캐싱을 위해 메인 메모리에 전용 버퍼 풀을 구축합니다. InnoDB는 다른 파일과 달리 여러 파일을 포함할 수 있는 테이블스페이스에 데이터와 인덱스를 저장합니다. 예를 들어 MyISAM에서는 테이블이 별도의 파일에 저장됩니다. InnoDB 테이블의 크기는 운영 체제의 파일 크기(일반적으로 2GB)에 의해서만 제한됩니다.
InnoDB의 모든 테이블은 동일한 데이터 파일 ibdata1에 저장됩니다(여러 파일일 수도 있고 독립적인 테이블 공간 파일일 수도 있음). 무료 솔루션은 데이터 파일을 복사하는 것입니다. binlog를 작성하거나 mysqldump를 사용하십시오.
MyISAM
MyISAM은 MySQL의 기본 스토리지 엔진입니다.
각 MyISAM 테이블은 세 개의 파일에 저장됩니다. frm 파일은 테이블 정의를 저장합니다. 데이터 파일은 MYD(MYData)입니다. 인덱스 파일은 MYI(MYIndex)의 확장입니다.
MyISAM은 상대적으로 단순하기 때문에 효율성 측면에서 InnoDB보다 낫습니다.
MyISAM 테이블은 크로스로 파일 형태로 저장됩니다. 플랫폼 데이터 전송으로 비용이 절감됩니다.
다음은 몇 가지 세부 사항과 구체적인 구현 차이점입니다.
1.InnoDB는 FULLTEXT 유형 인덱스를 지원하지 않습니다.
2. InnoDB는 테이블에 특정 행 수를 저장하지 않습니다. 즉, 테이블에서 select count(*)를 실행할 때 InnoDB는 행 수를 계산하기 위해 전체 테이블을 스캔해야 하지만 MyISAM은 행 수만 있으면 충분합니다. count(*) 문에 where 조건이 포함된 경우 두 테이블의 작업은 동일합니다.
3. AUTO_INCREMENT 유형 필드의 경우 InnoDB는 이 필드에 대한 인덱스만 포함해야 하지만 MyISAM 테이블에서는 다른 필드와 공동 인덱스를 설정할 수 있습니다.
4. DELETE FROM 테이블을 실행하면 InnoDB는 테이블을 다시 생성하지 않고 행 단위로 삭제합니다.
5. InnoDB에서는 LOAD TABLE FROM MASTER 작업이 작동하지 않습니다. 해결 방법은 먼저 InnoDB 테이블을 MyISAM 테이블로 변경한 다음 데이터를 가져온 후 InnoDB 테이블로 변경하는 것입니다. (예: 외부 키) 테이블은 적용할 수 없습니다.
또한 InnoDB 테이블의 행 잠금은 절대적이지 않습니다. MySQL이 SQL 문을 실행할 때 스캔할 범위를 결정할 수 없는 경우 InnoDB 테이블은 전체 테이블도 잠급니다. 예를 들어 update table set num= 1 “� a%”와 같은 이름
어떤 테이블도 만능은 아닙니다. 업종에 맞게 적절한 테이블 유형을 선택해야만 MySQL의 성능 이점을 극대화할 수 있습니다.
============================================= === ================
다음은 InnoDB와 MyISAM의 연결 및 차이점입니다!
1. Mysqld 4.0 이상에서는 Max가 아닌 버전을 포함한 트랜잭션을 지원합니다. 3.23에서는 트랜잭션을 지원하려면 최대 버전의 mysqld가 필요합니다.
2. 테이블 생성 시 타입을 지정하지 않으면 기본적으로 myisam이 적용되며 트랜잭션을 지원하지 않습니다.
show create table tablename 명령을 사용하면 테이블 유형을 확인할 수 있습니다.
2.1 트랜잭션을 지원하지 않는 테이블에 대한 시작/커밋 작업은 적용되지 않습니다. 테스트:
msyql 실행:
use test
drop; tn 존재
테이블 tn 생성(a varchar(10)) type=myisam;
테이블 삭제 ty
테이블 ty 생성(a varchar(10))
begin; ; > tn 값('a')에 삽입;
tn에서 *를 선택합니다.
기록을 볼 수 있습니다. 🎜>다른 mysql을 실행합니다.
use test;
select * from ty
tn만 레코드를 볼 수 있습니다.
그 다음에는
커밋합니다.
기록은 사람만 볼 수 있습니다. 
3. 다음 명령을 실행하여 비트랜잭션 테이블을 트랜잭션으로 전환할 수 있습니다(데이터는 손실되지 않음). Innodb 테이블은 myisam 테이블보다 더 안전합니다:
alter table tablename type=innodb; innodb 테이블에서는 명령을 사용할 수 없습니다. myisamchk -r table_name
하지만 check table과 mysqlcheck [OPTIONS] 데이터베이스 [tables]
===============를 사용할 수 있습니다. ========== ====================================
mysql에서 업데이트를 위한 선택 사용은 InnoDb에 대한 것이어야 하며 트랜잭션 내에서만 작동할 수 있습니다.
선택 조건이 다르고, 행 수준 잠금을 사용하는지 테이블 수준 잠금을 사용하는지가 다릅니다.
지침은 http://www.neo.com.tw/archives/900으로 전송됩니다.
InnoDB는 기본적으로 행 수준 잠금을 사용하므로 MySQL은 기본 키가 "명시적으로" 지정된 경우에만 행 잠금을 실행합니다( 선택한 데이터를 잠그십시오(예를 들어). 그렇지 않으면 MySQL은 테이블 잠금을 실행합니다(전체 데이터 양식 잠그기). ​
예: ​
id와 name이라는 두 개의 필드가 있고 id가 기본 키인 제품 양식이 있다고 가정합니다.
예 1: (기본 키를 명시적으로 지정하고 이 데이터가 있음, 행 잠금)
SELECT * FROM products WHERE id='3′ FOR UPDATE 이 정보, 잠금 없음)
SELECT * FROM; products WHERE id='-1′ FOR UPDATE;
예 2: (기본 키 없음, 테이블 잠금)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE; 키, 테이블 잠금)
SELECT * FROM products WHERE id<>'3′ FOR UPDATE
예 4: (불명확한 기본 키, 테이블 잠금)
SELECT * FROM products WHERE id LIKE '3′ FOR UPDATE;
참고 1:
FOR UPDATE는 InnoDB에만 적용 가능하며 적용하려면 트랜잭션 블록(BEGIN/COMMIT)에 있어야 합니다

이상은 apache php mysql의 내용을 포함하여 apache php mysql PHP와 MYSQL 트랜잭션 처리에 대해 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.

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