应用每个单独的模型,无法回滚或阻止任何插入运行
MODEL_A: MODEL_B 插入即使射击 Exception
MODEL_B:MODEL_A插入即使射击 Exception
$ MODEL_A-> insert();
$ MODEL_B-> insert();
//模型.A
try {
$statement = $pdo-> prepare( "INSERT INTO ..." );
$statement-> execute();
}catch{}
//模型.B
try {
$statement = $pdo-> prepare( "INSERT INTO ..." );
$statement-> execute();
}catch{}
//程序化是一个简单的解决方法
try {
#beginTransaction;
$statement = $pdo-> prepare( "INSERT INTO ..." );
$statement-> execute();
$statement = $pdo-> prepare( "INSERT INTO ..." );
$statement-> execute();
#commit;
}catch{}
如果第一次插入插入,第二次触发错误,不必像第一次回滚
在执行操作之前都需要进行测试
有人对如何解决这个问题有任何建议吗?
谢谢
最佳答案
您需要通过关闭自动提交来显式启动事务,然后在完成测试后提交或回滚事务。您可以使用 beginTransaction() 通过 PDO 来执行此操作, commit() ,和 rollback()功能。
如果插入位于不同的类中,您可以传递对 $pdo
对象的引用。
class ModelA {
function insert(&$pdo){
$statement = $pdo->prepare( "INSERT INTO ..." );
$statement->execute();
}
}
class ModelB {
function insert(&$pdo){
$statement = $pdo->prepare( "INSERT INTO ..." );
$statement->execute();
}
}
您的代码将如下所示:
// disable autocommit
$pdo->beginTransaction();
$modelA = new ModelA();
$modelA->insert($pdo);
$modelB = new ModelB();
$modelB->insert($pdo);
// check for errors, and either commit() or rollback()
$hasErrors = ? // Add your code to check for errors
if ($hasErrors){
$pdo->rollback();
} else {
$pdo->commit();
}
关于php - 一起运行模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15608605/