AWS lambda处理程序和MySQL数据库。第二个客户端连接看不到第一个客户端连接插入的行

时间:2016-08-04 08:12:14

标签: mysql python-2.7 transactions aws-lambda pymysql

我无法理解为什么第一个AWS lambda函数(在Python中)插入的值不会被另一个AWS lambda函数(使用不同的MySql客户端连接)看到。在这里我正在做的事情:

处理程序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()

然后我用命令行检查新行是否已正确插入 - >行

处理程序B:

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

这里最后一个查询不会返回新创建的行。为什么? 如果我使用与处理程序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

1 个答案:

答案 0 :(得分: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    |
           ---------------------

请注意,我假设您在A插入+提交之前正在读取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'")

此行为还取决于隔离级别设置。