sql >> データベース >  >> RDS >> Mysql

MyISAMとInnoDBでは単一のmysqlステートメントはアトミックですか?

    はい、いいえ:-)

    どちらの場合も、アクセスはシリアル化されます (InnoDBのようなトランザクションエンジンを使用していると仮定します)同じ行にヒットするため、互いに干渉しません。言い換えれば、ステートメントは アトミック。

    ただし、影響を受ける行数は、実際には接続を開いたときに設定された構成によって異なります。 mysql_affected_rows()のページ これは言うべきことです(私の太字):

    そして、mysql_real_connectページ から :

    つまり、で何が起こるかという点で CLIENT_FOUND_ROWS 構成されている場合、影響を受ける行は次のとおりです。

    UPDATE T1 SET C1 = 'dirty' WHERE id = 1
    

    何もない データが変更されたかどうかに関係します 一致した行のみ これは、両方のクエリで1になります。

    一方、CLIENT_FOUND_ROWSの場合 ではなかった 設定すると、2番目のクエリは実際には行を変更せず(すでに「dirty」が入力されているため)、行数はゼロになります。

    同じが必要な場合 その設定に関係なく動作(変更のみを表示)、次のようなものを使用できます:

    UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'
    


    1. Mysqlでこれを解決する方法(#1242-サブクエリは複数の行を返します)?

    2. Laravel5.5本番データベースを使用して移行を統合

    3. SQL Server(T-SQL)でパーティションテーブルをクエリするときに、各行のパーティション番号を返す

    4. OracleのCREATEORREPLACEVIEWに相当するSQLServer