2011-05-08 11 views
11

나는 이것을 잠시 숙고 해왔다.MySQL과 PDO : 이론적으로 PDO :: lastInsertId가 실패 할 수 있습니까?

거대한 비율의 웹 응용 프로그램을 고려해보십시오. 여기서는 수백 초의 SQL 쿼리가 매초 수행됩니다. lastInsertId 실패하는

$id = $db->lastInsertId(); 

는, 예를 가져올 그것을 가능 :이 마지막 쿼리의 ID를 증가 내가 자동차를 가져 오기 할 직후 다음

$q = $db->prepare('INSERT INTO Table 
       (First,Second,Third,Fourth) 
      VALUES (?,?,?,?)'); 
$q->execute(array($first,$second,$third,$fourth)); 

:

나는 내 코드를 실행 실행 된 일부 SQL 삽입 쿼리의 ID 내 두 코드 블록 사이? 차

는 : 그것은 실패 할 경우

, 무슨 일이 가능한 누출을 연결하는 가장 좋은 방법이 있을까요?

데이터베이스에서 적절한 ID를 가져 오기 위해 다른 SQL 쿼리를 만드는 것이 더 안전할까요?

답변

18

PDO 구현이 실제로 뭔가 골치 아픈 일을하지 않는다면 항상 안전 할 것입니다. 다음은 MySQL 정보에서 last_insert_id입니다.

생성 된 ID는 연결 기준으로 서버에서 유지 관리됩니다. 즉, 해당 클라이언트가 함수에 반환하는 값은 해당 클라이언트가 AUTO_INCREMENT 열에 영향을주는 가장 최근의 명령문에 대해 생성 된 첫 번째 AUTO_INCREMENT 값입니다. 이 값은 다른 클라이언트가 AUTO_INCREMENT 값을 생성하더라도 다른 클라이언트의 영향을받을 수 없습니다. 이 동작은 각 클라이언트가 다른 클라이언트의 활동에 관계없이 잠금 또는 트랜잭션없이 자체 ID를 검색 할 수있게합니다.

+0

괜찮습니다. 감사! – Mattis

4

번호 lastInsertId는 연결 단위이며, 서버에 대한 요청이 필요하지 않습니다. mysql은 항상 응답 패킷으로 다시 전송합니다.

그래서 execute 메소드가 예외를 throw하지 않으면 lastInsertId에 올바른 값을 가질 수 있습니다.

어떤 이유 (예 : 유효하지 않은 구문)로 인해 쿼리가 실패하지 않는 한 다른 삽입 ID를 제공하지 않습니다.이 경우 동일한 연결에서 이전 ID의 삽입 ID를 제공 할 수 있습니다. 하지만 다른 사람이 아니야.

+1

굉장한 마크, 그럼 나는 안전하다고 생각합니다 :) – Mattis