Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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事务有多个连接?_Php_Mysql_Transactions_Database Connection_Atomic - Fatal编程技术网

Php Mysql事务有多个连接?

Php Mysql事务有多个连接?,php,mysql,transactions,database-connection,atomic,Php,Mysql,Transactions,Database Connection,Atomic,我查了相关的问题,答案是肯定的,非常原子化 但我要说得更具体一些,因为这些问题没有那么具体,所以答案是: MySQL/INNODB 同时有几个连接 一个事务可能会写入相同的表,甚至更多,相同的表 查询。 只有一个数据库 根本不做锁表 . 没有嵌套事务 没有memcache或任何其他类似的系统,一切都很简单 可能的 我相信我们使用的是可序列化隔离,而不是低级别隔离 在这种情况下,我们是由Mysql引擎保证数据完整性将得到维护,还是转到特定情况: 那些同时写作的人会排队吗 事实上,回滚将按预期工作

我查了相关的问题,答案是肯定的,非常原子化

但我要说得更具体一些,因为这些问题没有那么具体,所以答案是:

MySQL/INNODB 同时有几个连接 一个事务可能会写入相同的表,甚至更多,相同的表 查询。 只有一个数据库 根本不做锁表 . 没有嵌套事务 没有memcache或任何其他类似的系统,一切都很简单 可能的 我相信我们使用的是可序列化隔离,而不是低级别隔离 在这种情况下,我们是由Mysql引擎保证数据完整性将得到维护,还是转到特定情况:

那些同时写作的人会排队吗

事实上,回滚将按预期工作

同时,读数将发现状态的一致性 那些作品

我的简单担忧是,如果不同连接的Transaction内部的提交和回滚是原子的,或者它们只是造成混乱:-


谢谢。

提交将结束事务

事务隔离级别真正决定了

在事务上下文中执行的所有语句都基于事务开始时的一致时间点快照可重复读取和序列化,或者

事务中的每个语句都将看到其他事务提交的更改,例如Oracle READ committed,或者

每条语句都将看到其他事务所做的更改,这些事务在SQL Server脏读未提交时尚未提交

回答您的问题:

同时,当可以获得锁时,将应用书写。如果没有其他会话持有不兼容的锁,则会获得锁,并且可以应用更改

回滚将按预期工作,也就是说,以Rollback语句结束的事务将还原应用的任何更改,锁定的行将返回到它们在事务开始时的状态,锁将被释放。这还包括触发器应用的任何DML更改。请注意,这仅适用于InnoDB。应用于MyISAM表的任何更改都将被提交,就像Oracle风格的自治事务一样

同时,每次读取都将来自具有可重复读取或可序列化事务隔离级别的一致快照

请注意,提交和回滚不会发生在事务内部,它们结束事务,并标记事务的结束。事务开始时的一致快照已消失;下一个事务将获得自己的一致快照。这些操作不是最好的原子操作,但它们本身不会造成混乱

InnoDB锁定机制可以防止冲突性更改。如果两个同时进行的会话试图更改同一行,其中一个会话覆盖另一个会话所做的更改,则至少一个事务将等待获取另一个事务持有的锁。当第一个事务释放锁时,第二个事务可以获得锁,并继续其更改;它可以自由覆盖其他会话刚刚所做的更改


事情最终是否会一团糟实际上取决于事务的设计,以及什么是一团糟。

提交将结束事务

事务隔离级别真正决定了

在事务上下文中执行的所有语句都基于事务开始时的一致时间点快照可重复读取和序列化,或者

事务中的每个语句都将看到其他事务提交的更改,例如Oracle READ committed,或者

每条语句都将看到其他事务所做的更改,这些事务在SQL Server脏读未提交时尚未提交

回答您的问题:

同时,当可以获得锁时,将应用书写。如果没有其他会话持有不兼容的锁,则会获得锁,并且可以应用更改

回滚将按预期工作,也就是说,以Rollback语句结束的事务将还原应用的任何更改,锁定的行将返回到它们在事务开始时的状态,锁将被释放。这还包括触发器应用的任何DML更改。请注意,这仅适用于InnoDB。应用于MyISAM表的任何更改都将被提交,就像Oracle风格的自治事务一样

同时,每次读取都将来自具有可重复读取或可序列化事务隔离级别的一致快照

请注意,提交和回滚不会发生在事务内部,它们结束事务,并标记事务的结束。始终如一的snapsho 交易开始时的t已消失;下一个事务将获得自己的一致快照。这些操作不是最好的原子操作,但它们本身不会造成混乱

InnoDB锁定机制可以防止冲突性更改。如果两个同时进行的会话试图更改同一行,其中一个会话覆盖另一个会话所做的更改,则至少一个事务将等待获取另一个事务持有的锁。当第一个事务释放锁时,第二个事务可以获得锁,并继续其更改;它可以自由覆盖其他会话刚刚所做的更改


事情是否会变得一团糟实际上取决于事务的设计,以及什么是一团糟。

两个小的补充:注意InnoDB实现了,一个用于读取,一个用于更新和删除。在设计交易时,应该考虑到可能发生的事情。@Pienka:很好。InnoDB实际上有四个不同的锁:shared S或exclusive X,每个锁都有一个intent版本:intent shared IS,intent exclusive IX。MySQL文档中有一个矩阵,其中的锁相互兼容,互不兼容;InnoDB还可能检测到死锁情况:两个或多个会话各自持有另一个事务继续所需的锁。当InnoDB检测到死锁情况时,解决方法是选择一个牺牲品,并在该会话中回滚事务,让另一方做出非常明确和具体的响应,非常感谢。我已经检查了查询流中的死锁,而不是问题。谢谢。两个小的补充:注意InnoDB实现了,一个用于读取,一个用于更新和删除。在设计交易时,应该考虑到可能发生的事情。@Pienka:很好。InnoDB实际上有四个不同的锁:shared S或exclusive X,每个锁都有一个intent版本:intent shared IS,intent exclusive IX。MySQL文档中有一个矩阵,其中的锁相互兼容,互不兼容;InnoDB还可能检测到死锁情况:两个或多个会话各自持有另一个事务继续所需的锁。当InnoDB检测到死锁情况时,解决方法是选择一个牺牲品,并在该会话中回滚事务,让另一方做出非常明确和具体的响应,非常感谢。我已经检查了查询流中的死锁,而不是问题。谢谢两位。