【问题标题】:uncommitted data in one transaction get access by other transaction.. why?一个事务中未提交的数据被其他事务访问..为什么?
【发布时间】:2017-10-30 21:39:25
【问题描述】:

在一个事务中插入查询或更新查询会自动提交,即使我没有在该事务下提交它并且插入的数据可以被其他事务访问?为什么会这样。 例如:

我在两个不同的会话中尝试以下两个事务: 会话 1:

START TRANSACTION;

INSERT INTO test (id) VALUES (1);

第 2 节:

START TRANSACTION;

 select * from test where id=1

这会被执行并给我 id 1 的数据;

现在,我想问一下,如果我不在第一个事务中提交插入查询,那么如何在第二个事务中访问插入查询的数据。

我阅读了 stackoverflow 上的大部分链接,但他们都这么说

您在同一事务中所做的一切对同一事务中的后续命令都是可见的。 在提交之前不要对其他事务进行。这适用于所有隔离级别,读取未提交除外。

我的 innodb 配置设置如下:

自动提交开启

innodb_commit_concurrency 0

innodb_flush_log_at_trx_commit 1

tx_isolation 可重复读取

此设置是否影响交易期间的数据:

【问题讨论】:

  • 您自己回答了您的问题。设置为autocommit ON,因此无论何时发生某些 DML,它都会自动提交。
  • 如果我在 conf 文件中更改我的设置并将 autocommit 设置为 OFF 那么它会起作用吗?
  • 它应该处于理想状态..
  • 那么事务有什么用呢?
  • 可重复阅读

标签: mysql


【解决方案1】:

您可能使用引擎类型 MyISAM 的表。这些不支持事务。请改用引擎类型 InnoDB。您可以使用

简单地转换您的表格
ALTER TABLE foo ENGINE=InnoDB;

要检查使用的是哪个引擎,请检查

的最后几行
SHOW CREATE TABLE foo\G

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2011-04-30
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多