2016-08-04 47 views
0

Ich kann nicht verstehen, warum Werte, die von einer ersten AWS-Lambda-Funktion (in Python) eingefügt wurden, von einer anderen AWS-Lambda-Funktion nicht sichtbar sind (mit einer anderen MySql-Clientverbindung). Hier ist, was ich tue:AWS Lambda-Handler und MySQL-Datenbank. Die eingefügte Zeile einer ersten Clientverbindung ist für eine zweite Clientverbindung nicht sichtbar.

Handler A:

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

Handler B:

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

Handler A:

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

Dann prüfe ich mit einer Befehlszeile, die das neue Zeile wurde korrekt eingefügt -> OK

Handler B:

// client B 
with conn.cursor() as cursor: 
    cursor.execute("SELECT * FROM my_table WHERE id = 'myid'"); 

Hier die letzte Abfrage nicht zurück die neu erstellte Zeile. Warum ? Howevere, wenn ich eine neue Verbindung mit Handler B verwenden funktioniert es

Handler 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 !! 

Ich habe vor Ort mit einer lokalen Datenbank getestet und es funktioniert gut:

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 

Antwort

0

Möglicherweise liegt eine Transaktionsisolierung vor.

Wenn Sie etwas aus der Datenbank in B lesen, bevor A einfügt, dann verwendet B den Datenbankstatus (Snapshot) von der Zeit, bevor A eingefügt (und committed) und liest diesen Snapshot auch nach dem Commit von 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 | 
      --------------------- 

Bitte beachte, dass ich die Annahme, die Sie etwas in B vor A Einsätze + verpflichtet lesen. Ich kann Ihre vollständige Quelle nicht sehen, so weiß ich nicht, ob das stimmt, aber ich denke, es ist sehr wahrscheinlich ist :)

Commit/Rollback-Transaktion in B und dann sollte B die Zeile von A.

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

Dieses Verhalten hängt auch von den Isolationsstufeneinstellungen ab.