mysqli 트랜잭션/저장점 함수와 query()를 사용한 수동 함수 비교
다음 두 개의 코드 작업을 동일하게 수행하거나 네이티브를 수행합니다.mysqli
트랜잭션 기능이 추가 작업을 수행합니까?
특히 트랜잭션 시작 및 커밋/세이브 포인트 생성 및 릴리스 시 오류를 처리하고 보고하는 방법에 관심이 있습니다.
특정 사용mysqli
트랜잭션 처리를 위한 기능:
$db = new mysqli('localhost', 'root', 'batman', 'batcave');
if (!$db->begin_transaction()) { throw new Exception($db->error); }
exc_query('INSERT INTO utility_belt SET item="apple"');
exc_query('INSERT INTO utility_belt SET item="banana"');
if (!$db->savepoint('vegetables')) { throw new Exception($db->error); }
exc_query('INSERT INTO utility_belt SET item="potato"');
exc_query('DELETE FROM utility_belt WHERE item="turnip"');
if (!$db->release_savepoint('vegetables')) { throw new Exception($db->error); }
exc_query('INSERT INTO utility_belt SET item="orange"');
if (!$db->commit()) { throw new Exception($db->error); }
plain old 사용query
같은 작업을 수행하는 기능:
$db = new mysqli('localhost', 'root', 'batman', 'batcave');
exc_query('START TRANSACTION');
exc_query('INSERT INTO utility_belt SET item="apple"');
exc_query('INSERT INTO utility_belt SET item="banana"');
exc_query('SAVEPOINT vegetables');
exc_query('INSERT INTO utility_belt SET item="potato"');
exc_query('DELETE FROM utility_belt WHERE item="turnip"');
exc_query('RELEASE SAVEPOINT vegetables');
exc_query('INSERT INTO utility_belt SET item="orange"');
exc_query('COMMIT');
의 실장exc_query
위에서 사용한 함수:
function exc_query($q) {
global $db;
if (!$db->query($q)) {
throw new Exception($db->error);
}
}
내가 왜 물어보지?
이 작업을 수행하려고 하면 가끔 문제가 발생합니다.RELEASE SAVEPOINT <name>
, 및 보다SAVEPOINT <name> does not exist
제가 이전에 보낸 것은 확실합니다만,SAVEPOINT <name>
서버에 접속합니다.
MariaDB의 설명서에서 읽은 내용에 따르면 이 오류는 초기 단계에서 발생할 수 있습니다.START TRANSACTION
실패했어요.이 경우 트랜잭션이 시작되지 않습니다.SAVEPOINT <name>
묵살당하겠지만RELEASE SAVEPOINT <name>
에러가 발생하게 됩니다.
궁금한 점은 다음 행은 이러한 경우 첫 번째 트랜잭션을 생성하는 데 실패하지 않는다는 것입니다.
if (!$db->query($q)) {
throw new Exception($db->error);
}
...그래서 내가 옳은지 아닌지는 잘 모르겠어.유감스럽게도 이러한 mysqli 함수가 어떻게 동작하는지에 대한 공식 PHP 문서는 큰 도움이 되지 않습니다.
https://github.com/php/php-src/blob/master/ext/mysqli/mysqli_nonapi.c#L1115 기반:
static int mysqli_savepoint_libmysql(MYSQL * conn, const char * const name, zend_bool release)
{
int ret;
char * query;
unsigned int query_len = spprintf(&query, 0, release? "RELEASE SAVEPOINT `%s`":"SAVEPOINT `%s`", name);
ret = mysql_real_query(conn, query, query_len);
efree(query);
return ret;
}
PHP는 동일한 쿼리를 데이터베이스로 전송할 뿐이며 다른 작업은 수행하지 않습니다.
왜 그런지MySQLi::savepoint()
와는 전혀 다르게 기능할 것이다MySQLi::query("SAVEPOINT")
,저는 모르겠어요.PHP 소스 내부의 에러 처리는 같은 것 같기 때문에, 저는 당신의 결과를 기대하고 있습니다.$db->query($q)
되려고false
만약 일이 잘못되면요
언급URL : https://stackoverflow.com/questions/27819267/mysqli-transaction-savepoint-functions-vs-manually-using-query
'sourcecode' 카테고리의 다른 글
JavaScript로 div 스크린샷을 찍는 방법 (0) | 2023.01.30 |
---|---|
도커 컴포지트와 도커 실행을 사용한 결과 차이 (0) | 2023.01.30 |
vuejs 앱에서 동적 기본 URL을 설정하려면 어떻게 해야 합니까? (0) | 2023.01.30 |
Panda 데이터 프레임에서 여러 열 선택 (0) | 2023.01.30 |
DB 스키마 변경을 추적하는 메커니즘 (0) | 2023.01.30 |