<p>저는 PDO만 사용하는 레거시 PHP 코드 베이스에 배정되었습니다.
연결은 다음 패턴을 사용하여 수행됩니다.
;
<pre class="lang-php Prettyprint-override"><code>// MySQL 데이터베이스에 연결
$con = new mysqli($host, $user, $password, $database);
// 연결 확인
if ($con->connect_error) {
die("연결 실패: " . $con->connect_error);
}
$con->자동 커밋(true);
<p>그리고 해당 자동 커밋(true)을 사용하면 MySQL 서버가 SET autocommit = 0으로 구성된 경우에도 예상대로 작동합니다. </p><p>이제 일반 SQL에서 준비된 명령문으로 마이그레이션하려고 하므로 다음과 같이 작성했습니다.</p><p><br /></p>
<pre class="lang-php Prettyprint-override"><code>$dsn = "mysql:host=$host;dbname=$database";
$pdo = 새 PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
<p>아래의 예제 함수</p>
<pre class="lang-php Prettyprint-override"><code>함수 updateTeam($pdo, $name, $id)
{
노력하다 {
$데이터 = [
'이름' => $이름,
'id' => $id
];
$sql = "업데이트 팀 SET 이름 = :name WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->실행($data);
// $pdo->커밋();
}
잡기(PDOException $e) {
db::$pdo->롤백();
error_log('실패: ' . $e->getMessage() );
}
잡기 (예외 $exc) {
db::$pdo->롤백();
error_log('실패: ' . $exc->getMessage());
}
}
<p>제출하지 마세요. 작동하려면 $pdo->commit();의 주석 처리를 제거해야 하는데, 응용 프로그램의 모든 쿼리 문을 변경해야 하기 때문에 원하지 않습니다.
PDO 구성에서 무엇을 놓쳤나요? 나는 var_dump($pdo->query('SELECT @@autocommit')->fetchAll()); 을 시도했고 결과는 </p><p><code></code>< /p>
<pre class="brush:php;toolbar:false;">array(1) { [0]=> array(2) { ["@@autocommit"]=> [0]=> 문자열(1) "0" } }</pre>
<p><br /></p>
PDO의 자동 커밋은 MySQL의 자동 커밋과 다릅니다. 즉, MySQL 구성에서 자동 커밋 값을 기본값을 0으로 설정하면 PDO::ATTR_AUTOCOMMIT의 기본값이 변경되지 않습니다. PDO::ATTR_AUTOCOMMIT의 기본값은 항상 true입니다.
PDO::ATTR_AUTOCOMMIT 값을 동일한 값으로 변경하거나 부울 또는 정수가 아닌 다른 값으로 변경하면 무시됩니다. 즉, 두 작업 모두 무작동입니다.
으아악PDO::ATTR_AUTOCOMMIT를 비활성화하고 활성화하여 속일 수 있습니다.
으아악이것은 MySQL 서버를 두 번 호출하고 MySQL 자동 커밋 값을 1
로 설정해야 합니다.