这是关于SQL的问题,但目的是创建一个php脚本。
CONTEXT
假设我有一个包含2个表的数据库(在InnoDB引擎上设置):
现在有2个用户访问我的应用程序(在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());
}
答案 0 :(得分:2)
正确,您可以在事务中执行多个查询。这实际上是使用交易的重点。
In PDO, from the documentation,只要您通过调用PDO::beginTransaction()
启动了一个事务,您就可以执行多个查询,并且在您完成之前,任何人都看不到更改(即通过调用{{ 1}})。
您不仅限于在交易中进行更新;您还可以发出复杂的查询来提取数据,并可能使用该信息来构建更多的更新和查询;当交易处于活动状态时,您可以保证在您工作的过程中没有其他人可以进行更改。有关事务的进一步阅读,请参阅数据库服务器提供的文档。
在MySQL中使用InnoDB引擎,具体来说,你有行级粒度,这意味着只有行被锁定,而不是像(较旧的)MyISAM引擎那样整个表。
答案 1 :(得分:1)
如果你正在使用InnoDB引擎,你可以在MySQL中打开任意数量的事务。每个开放交易的成本都很低,这通常是一个边际问题,除非您正在处理一个被写活动淹没的表格。随着事务处理数量的增加,MySQL越难维护各种不完整的版本。
如果你想更多地了解MySQL处理事务的方式,可以在huge section on it in the manual讨论MVCC(多版本并发控制)的含义。
如果您有多个操作要进行 atomic ,那么事务才真正相关,即所有查询都成功或者全部失败。在您的示例中,您有一个语句,根据定义原子。将它包装在事务块中会带来更多的开销,而这些开销并没有真正为您提供任何您已经拥有的开销。