所以我找到了这个示例代码,并计划为我的一个项目做类似的事情,但有一个问题就是困扰我
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (Exception $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
}
前端使用一个mysql用户(比如说'webaccess-admin''密码')来连接到数据库,那么如果两个人一次运行代码会发生什么情况,而其中一个代码失败呢?如果php脚本的一个实例的执行错误导致该脚本的另一个实例的sql查询也回滚?我必须使用命名交易吗?或单独的mysql用户?
这是我正在谈论的一个例子:
person1 - >开始交易
person2 - >开始交易
//两个用户执行的sql代码
person1 - >提交
person1 [!错误]
person2 - >仍在运行查询(或者现在可能已提交)
person1会触发回滚,第2个人运行的查询会发生什么?
答案 0 :(得分:1)
事务是原子的,也就是说,任何给定的进程都会看到所有事务,或者没有任何事务。在您的示例中,person1的事务中的错误不会出现在person2中,回滚也不会影响person2的行为。
然而,有一些警告。例如,只保证非混合表类型的原子性,以及表引擎支持它的原子性。有关详细信息,请参阅MySQL site
答案 1 :(得分:0)
这完全取决于数据库连接使用的事务隔离。有了php,我很确定他们根本不会干涉。通过UPDATE和INSERT语句对数据库进行更改时,它们通常在提交事务之前不会生效。