为什么我可以得到一个未提交的行?

时间:2015-12-23 07:22:24

标签: mysql transactions

在我的代码中,我启动了一个事务,并插入了一些数据。

然后我可以使用select来获取我刚刚在事务提交之前插入的行 这是怎么发生的?

我的数据库是带有Engine Innodb的Mysql。

谢谢!

3 个答案:

答案 0 :(得分:1)

如上所述,这就是交易的运作方式。执行它们的过程会看到'结果即使他们尚未承诺。但是,其他进程在提交之前不会看到它们。 (即如果另一个用户登录到数据库并查询行,他们将无法找到它们,直到您实际提交它们为止)。

答案 1 :(得分:0)

默认情况下,MySQL在自动提交模式下工作 - 在转码中,所有更新操作(INSERT / UPDATE / INSERT)都会自动提交。但你可以使用:

SET autocommit=0;

要了解更多详细信息,您可以阅读文档:http://dev.mysql.com/doc/refman/5.7/en/commit.html

To disable autocommit mode explicitly, use the following statement:

SET autocommit=0;

After disabling autocommit mode by setting the autocommit variable to zero, changes to transaction-safe tables (such as those for InnoDB or NDB) are not made permanent immediately. You must use COMMIT to store your changes to disk or ROLLBACK to ignore the changes.

autocommit is a session variable and must be set for each session. To disable autocommit mode for each new connection, see the description of the autocommit system variable at Section 5.1.4, “Server System Variables”.

答案 2 :(得分:0)

正如我在评论中所说的那样,交易是如何运作的 您可能正在执行与SELECT数据相同的事务中执行INSERT,因此即使尚未提交,这些数据实际上也存在于该交易中。 您可以尝试在另一个事务中移动SELECT或将其用作独立语句(这仍然是引擎盖下的另一个事务),您将不再能够看到数据。