Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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
如何读取mysql中由after insert触发器创建的innodb行?_Mysql_Triggers_Locking - Fatal编程技术网

如何读取mysql中由after insert触发器创建的innodb行?

如何读取mysql中由after insert触发器创建的innodb行?,mysql,triggers,locking,Mysql,Triggers,Locking,让我直截了当地说。我有两个名为A和B的表。在表A中,我有一个触发器(在INSERT之后),负责在表B中插入一行,其中包含NEW.ID。在表B中还有一个触发器(INSERT之后),它使用mysql UDF调用php外部脚本,并在UDF中传递NEW.table_a_ID。现在脚本尝试访问表a中新插入的行 问题:我无法读取表A中新插入的行。我可以读取第n-1行,但不能读取第n行。默认情况下,mysql自动提交为1,Im使用的引擎为INNODB。这个问题的解决方法是什么?在InnoDB事务的上下文中,当

让我直截了当地说。我有两个名为A和B的表。在表A中,我有一个触发器(在INSERT之后),负责在表B中插入一行,其中包含NEW.ID。在表B中还有一个触发器(INSERT之后),它使用mysql UDF调用php外部脚本,并在UDF中传递NEW.table_a_ID。现在脚本尝试访问表a中新插入的行


问题:我无法读取表A中新插入的行。我可以读取第n-1行,但不能读取第n行。默认情况下,mysql自动提交为1,Im使用的引擎为INNODB。这个问题的解决方法是什么?

在InnoDB事务的上下文中,当触发AFTER INSERT触发器时,插入到表A中的行尚未提交。直到触发器完成后,INSERT语句才“完成”

第二个数据库会话的事务隔离级别将决定该会话是否可以看到未提交的数据。默认事务隔离级别为可重复读取

InnoDB还提供了一个(更严格的)
可序列化的
隔离级别,一个(类似Oracle的)
读取提交的
隔离级别,以及一个
读取未提交的
隔离级别

请注意,在您描述的场景中,自动提交实际上并不重要;“提交”操作只会在INSERT语句返回后发生,而在INSERT触发器完成后才会发生



如果在触发器的MyISAM表中插入行,则这些行将对另一个数据库会话可见。(这是在MySQL中实现类似Oracle的自治事务的一种方法。)

感谢您的精彩解释。你是说我把数据库引擎从innodb改成myisam。没有其他解决方法吗?@SURFER:我想说的是,如果我必须在Oracle中执行此操作,一种方法是添加一个“额外”表,然后使用自治事务向其中插入,这样我就可以向“额外”表中插入并提交,然后继续处理。。。插入到“extra”表中的那一行将可用于其他会话,即使我尚未提交原始事务。我是说,使用MyISAM引擎使用“额外”表模拟Oracle自治事务行为。如何将其从innodb更改为myisam?@SURFER:这样做的语法就是
“ALTER TABLE B ENGINE=myisam”
。。。但是,如果为表或引用表定义了任何外键约束,则会引发错误。即使将表B转换为MyISAM,这也不会“修复”查询表A的问题。使用SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED解决了我的问题