2016-08-04 8 views
0

最初のAWSラムダ関数(Pythonで)によって挿入された値が(別のMySqlクライアント接続を使用して)別のAWSラムダ関数で見えない理由を理解できません。ここに私がやっている:AWSラムダハンドラとMySQLデータベース。最初のクライアント接続で挿入された行が2番目のクライアント接続で表示されない

ハンドラA:

conn = DBConnectionFactory.create() 
// conn.thread_id() returns X 

ハンドラB:

conn = DBConnection.instance() 
// conn.thread_id() returns Y 

ハンドラA:次に

with conn.cursor() as cursor: 
    cursor.execute("INSERT INTO my_table (id, ...) VALUES ('myid', ...)") 
conn.commit() 

は、私は、コマンドラインで確認すること新しい行が正しく挿入されている - > OK

ハンドラーB:

ここで最後のクエリは新しく作成された行を返しません。どうして ? Howevere私はハンドラBとの新しい接続を使用する場合、それは動作します

ハンドラB:

conn = DBConnection.instance() 
// conn.thread_id() returns Z 
with conn.cursor() as cursor: 
    cursor.execute("SELECT * FROM my_table WHERE id = 'myid'"); 
    // OK the row is found !! 

私は、ローカル・データベースでローカルにテストしてみた、それがうまく機能しています:

conn1 = DBConnectionFactory.create(); 
conn2 = DBConnectionFactory.create(); 

with conn2.cursor() as cursor: 
    cursor.execute("INSERT INTO my_table (id, ...) VALUES(X, ...)") 
conn2.commit() 

with conn1.cursor() as cursor: 
    cursor.execute('SELECT * FROM my_table WHERE id = X') 
    print(cursor.rowcount) // OK working I have 1 row 

答えて

0

トランザクション分離の可能性があります。

Aが挿入される前にBのデータベースから何かを読み取っている場合、BはAが挿入(コミット)される前のデータベース状態(スナップショット)を使用し、Aがコミットした後もこのスナップショットを読み続ける。

https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html

   Session A    Session B  
time 
|   SELECT * FROM t; 
|   empty set 
|         INSERT INTO t VALUES (1, 2); 
| 
v   SELECT * FROM t; 
      empty set 
            COMMIT; 

      SELECT * FROM t; 
      empty set 

      COMMIT; 

      SELECT * FROM t; 
      --------------------- 
      | 1 | 2 | 
      --------------------- 

私はあなたが+のコミットを挿入する前にBで何かを読んでいるという仮定を使用します。私はそれが本当ならば私は知らない、あなたの完全なソースを見ることはできませんが、私はそれはおそらく

はBで/ロールバックトランザクションをコミットしてからB行がAで挿入されるはずです:)だと思う

# client B 
conn.rollback() # or conn.commit() 
with conn.cursor() as cursor: 
    cursor.execute("SELECT * FROM my_table WHERE id = 'myid'") 

この動作は、分離レベルの設定によっても異なります。

関連する問題