4

MySQLに対する通常の単一のクエリステートメントで、mysql_affected_rows()==1何かが更新されたかどうかを判断するために使用できます。ここで、次のトランザクションを実行しようとしているとします。

USE myDB;
START TRANSACTION;
UPDATE members SET member_active=0 WHERE member_id = 53;
UPDATE member_subscriptions SET subscription_active=0 WHERE member_id = 53;
COMMIT;
ROLLBACK;

私はこれらの2つの更新ステートメントを持っているので、成功したトランザクションで同等である必要がありmysql_affected_rows()==2ますか?

または、成功を確認するためのより良い方法はありますか?

4

3 に答える 3

1

両方のトランザクションを追跡していて、どちらのトランザクションが実行されていないか、どのような反応になるかをさらに適切に判断できる場合。

USE myDB;
START TRANSACTION;
UPDATE members SET member_active=0 WHERE member_id = 53;
$count1= mysql_affected_rows();
UPDATE member_subscriptions SET subscription_active=0 WHERE member_id = 53;
$count2= mysql_affected_rows();
COMMIT;
ROLLBACK;

$total_affected_rows = $count1 + $count2;
于 2012-07-25T07:10:26.823 に答える
1

はい、 mysql_affected_rows()==2 をチェックすることは、アプリケーションレベルからの代替方法です。

適切なトランザクションを使用しているため、100% 成功するcommitか ( )、成功しないか ( ) になります。rolled back

編集: ROW_COUNT()MySQL で関数を使用して、最後のクエリから影響を受けた行を次のように取得できます。

USE myDB;
START TRANSACTION;
UPDATE members SET member_active=0 WHERE member_id = 53;
SELECT ROW_COUNT() INTO @count1;
UPDATE member_subscriptions SET subscription_active=0 WHERE member_id = 53;
SELECT ROW_COUNT() INTO @count2;
COMMIT;
ROLLBACK;

これらの合計は 2 に等しいはずです

SELECT ((@count1 + @count2) = 2) AS status;
于 2012-07-25T07:13:15.267 に答える
1

mysql_affected_rowsの値を変数に保持する必要があります。そして、全体の更新は、これらの変数の一部になります。

于 2012-07-25T07:07:14.210 に答える