sourcecode

mysqli 트랜잭션/저장점 함수와 query()를 사용한 수동 함수 비교

copyscript 2023. 1. 30. 22:16
반응형

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

반응형