我无法理解为什么第一个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
答案 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'")
此行为还取决于隔离级别设置。