2

我已经搜索过了,我似乎找不到任何东西。

情况如下:

  • t1 = 表 1
  • t2 = 表 2
  • v = 表 1 和表 2 的视图已连接

1.) 用户 1 登录到数据库。是否SELECT * FROM v

2.) 用户 2 登录到同一个数据库并执行INSERT INTO t1 VALUES(1, 2, 3)

3.)用户 1 在SELECT * FROM v;注销并重新登录之前,另一个用户 1 无法看到用户 2 插入的行。

似乎视图没有在“会话”之间同步?我怎样才能让用户 1 可以看到 INSERT?

仅供参考,我正在使用 python 和 mysqldb。

4

2 回答 2

1

用户 2 可以简单地提交他们的事务,而不是注销并重新登录。

MySQL InnoDB 表使用事务,在一个或多个 SQL 语句之前需要一个 BEGIN,然后是 COMMIT 或 ROLLBACK,从而导致所有更新/插入/删除发生或不发生。但是有一个“功能”,如果没有明确发出,会导致自动 BEGIN,并且在连接关闭时会自动 COMMIT。这就是您在其他用户关闭连接后看到更改的原因。

你真的应该养成显式开始和提交事务的习惯,但还有另一种方法:设置 connection.autocommit = True,这将导致每个 sql update/insert/delete 都被包装在自己的隐式事务中,从而导致您最初预期的行为。

不要认为我上面所说的完全是事实正确的,但这足以解释正在发生的事情以及如何控制它的基本原理。

于 2012-08-16T00:59:48.813 回答
0

它与使用 MySQL UPDATE 命令有关吗? http://dev.mysql.com/doc/refman/5.0/en/update.html

于 2012-08-16T06:24:02.847 回答