2013-08-02 32 views
2

所以我发现这个示例代码和打算为我的项目做类似的东西,但有是一个的缠着我同时交易可能会相互干扰吗? PHP/MySQL的

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''password')连接到数据库,那么如果两个人同时运行代码会发生什么情况,而其中一个代码会失败?执行php脚本的一个实例时是否会出现错误,导致该脚本的另一个实例的sql查询也会回滚?我必须使用命名的交易或什么?或单独的mysql用户?

这里有一个例子就是我在谈论:

PERSON1 - >开始交易

PERSON2 - >开始交易的两个用户

PERSON1执行

// sql代码 - > commit

person1 [!error]

person2 - >仍在运行的查询(或者现在可能已经提交)

person1会触发回滚,那么person2运行的查询会发生什么?

回答

0

事务旨在是原子的,也就是说,任何给定的进程都将看到所有的事务,或者没有任何事务。在你的例子中,那么person1的交易中的一个错误不会出现在person2上,回滚也不会影响person2的行为。

但是有一些注意事项。例如,只有非混合表类型和表引擎支持的原子性才能保证原子性。完整的详细信息可在MySQL site

+0

好的,所以即使前端的两个实例都使用相同的mysql用户名吗? –

+0

这应该是确定的 - 即使它们共享相同的登录凭证,每个连接都是独立处理的。 – 2013-08-02 02:58:25

0

这完全取决于数据库连接使用的事务隔离。用PHP,我很肯定他们不会干涉一切。通过UPDATE和INSERT语句更改数据库时,通常在提交事务之前不会生效。