Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL MyISAM/InnoDB更新不是跨两个连接的原子更新(强制写入?)_Php_Mysql_Solr_Myisam - Fatal编程技术网

Php MySQL MyISAM/InnoDB更新不是跨两个连接的原子更新(强制写入?)

Php MySQL MyISAM/InnoDB更新不是跨两个连接的原子更新(强制写入?),php,mysql,solr,myisam,Php,Mysql,Solr,Myisam,更新:我们试图简单地将数据库转换为InnoDB,但仍然遇到同样的问题自动提交已打开。是否需要一些额外的语句来确保其他连接可以看到更改 更新2:我们通过将表设置为InnoDB并将全局事务隔离级别设置为可序列化的,成功地使事情运转起来,但是这明显减慢了速度。此外,并不是所有人都完全相信这已经解决了问题,因为经济放缓可能只是给了比赛条件足够的时间以正确的顺序执行。无论如何,我们正在继续调查 我在MySQL中遇到了一个问题,从一个连接进行的写入不能立即从另一个连接中看到(这恰好是一个SOLR upda

更新:我们试图简单地将数据库转换为InnoDB,但仍然遇到同样的问题<代码>自动提交已打开。是否需要一些额外的语句来确保其他连接可以看到更改

更新2:我们通过将表设置为InnoDB并将全局事务隔离级别设置为
可序列化的
,成功地使事情运转起来,但是这明显减慢了速度。此外,并不是所有人都完全相信这已经解决了问题,因为经济放缓可能只是给了比赛条件足够的时间以正确的顺序执行。无论如何,我们正在继续调查


我在MySQL中遇到了一个问题,从一个连接进行的写入不能立即从另一个连接中看到(这恰好是一个SOLR update查询)

是这样的:

  • 用户在web应用程序中进行更改
  • 我们注意到当前的修订号r1
  • MySQL表(MyISAM)是用更改和下一个版本r2编写的。 [此时,代码中的更改应该已写入数据库,如果我们从同一连接再次查询它,我们将看到它。]
  • 我们通过http向Solr发送信号,用r1版本更新自身
  • Solr(来自另一个连接)查询MySQL中的changes>r1,但没有获取刚刚在步骤3中编写的更改
  • 这是预期的/正常的行为吗?我在文档中找不到任何东西表明跨连接的更新不是原子的。请记住,在第二个连接发出更新自身的信号时,更改应该已经写入数据库

    如果这是正常行为,那么必须有某种方法强制MySQL将其连接写/刷新回磁盘,以强制正常的原子操作,并保证其他连接将看到更改。然而,对于MyISAM表,我仍然找不到任何关于这一点的提及

    我还应该补充一点,如果我在第3步和第4步之间明确地设置了一个短延迟(1-2秒),事情就会正常进行

    以下是我们正在运行的MySQL版本:

    mysql-server-5.1.66-2.el6_3.x86_64
    php-mysql-5.3.3-14.el6_3.x86_64
    mysql-libs-5.1.66-2.el6_3.x86_64
    mysql-5.1.66-2.el6_3.x86_64
    

    MyISAM不会刷新到磁盘,它会写入文件系统缓冲区,最终由操作系统负责写入磁盘

    但无论如何,另一个查询,甚至是另一个会话中的查询,应该能够立即读取MyISAM数据,即使它从文件系统缓冲区中读取数据。这一部分对mysqld进程应该是透明的

    MyISAM中也没有事务隔离,因此没有未提交的更改。不管事务隔离模式如何,任何会话都应该能够根据MyISAM表读取任何已完成的更改

    因此,如果您使用MyISAM表,您所描述的步骤(步骤5没有看到r2的变化)永远不会发生。因此,我猜你误解了行动的顺序,你实际上是在试图阅读尚未做出的更改


    无论如何,这是没有意义的,因为你真的应该使用InnoDB。那么事务隔离就很重要了。您可能希望将事务隔离为读提交的,这不会像SERIALIZABLE那样阻止并发,但它确实允许事务查看任何数据的最新版本。也就是说,如果您提交了一个更改,并且Solr正在使用READ-COMMITTED,那么Solr应该立即看到该更改。

    MyISAM表是垃圾,该引擎非常糟糕。如果可以,请使用InnoDB,因为它是一个与ACID兼容的事务性MVCC数据库引擎。它还将所有事务刷新到磁盘,以确保它们已提交。@tadman:将事务刷新到磁盘不是ACID中的D(可用性)吗?这是个好消息,伙计们,我们也在考虑切换到InnoDB。马上。我想你会从引擎中得到更多可预测的行为。您可以使用
    altertable。。。ENGINE=InnoDB
    ,对于少量数据,它只需要很少的时间。