这是一个关于SQL的问题,但目的是创建一个php脚本。
上下文
假设我有一个包含两个表的数据库(设置在InnoDB引擎上):
现在有两个用户访问我的应用程序(在php中),并且都启动了一个执行以下算法的网页:
问题
SQL能否处理同一表上的2个事务?
PhP代码(用于记录)
$host = 'localhost';
$database = 'user';
$user = 'root';
$password = '';
$encode = 'utf8';
$dsn = "mysql:host=$host;dbname=$database;charset=$encode";
$pdo = null;
try {
$pdo = new PDO($dsn, $user, $password);
$query = "INSERT INTO user (name, city) VALUES ('test', 'Paris')";
$pdo->beginTransaction();
if( $pdo->inTransaction() ) {
// Can I still launch the query ?
}
else {
// Or should I stop here ?
}
if( $pdo->query( $query ) ) {
$pdo->commit();
}
else {
$pdo->rollBack();
}
}
catch( PDOException $e ) {
print_r($pdo->errorInfo());
}发布于 2016-09-12 14:22:35
正确,您可以在事务中执行多个查询。这实际上就是使用事务的意义所在。
在PDO中,来自文档,只要您已经通过调用PDO::beginTransaction()启动了一个事务,您就可以执行多个查询,并且在您完成之前,其他任何人都不会看到这些更改(即通过调用PDO::commit())。
您不仅限于在事务中进行更新;您还可以发出复杂的查询来提取数据,并可能使用这些信息来构建更多的更新和查询;当事务处于活动状态时,您可以保证在您的工作中没有其他人可以进行更改。有关事务的进一步阅读,请参阅数据库服务器提供的文档。
具体来说,在InnoDB引擎中使用MySQL,您有行级粒度,这意味着只有行被锁定,而不是整个表,比如(旧的) MyISAM引擎。
发布于 2016-09-12 14:22:26
如果使用MySQL引擎,则可以在InnoDB中打开任意数量的事务。每个打开的事务都有一个小成本,这通常是一个边缘问题,除非您正在处理一个被写活动淹没的表。随着打开的事务数量的增加,MySQL维护各种不完整版本的难度就越大。
如果您想了解更多关于MySQL如何处理事务的信息,那么就会有一个手册中关于它的重要章节来讨论MVCC (多版本并发控制)的含义。
只有当您有多个要创建原子的操作时,事务才是真正相关的,也就是说,所有的查询都成功了,或者它们都失败了。在这里的示例中,您有一个语句,根据定义,它是原子的。将其封装在事务块中会带来更多的开销,这些开销实际上不会给您带来任何您尚未拥有的东西。
https://stackoverflow.com/questions/39452236
复制相似问题