我不知道交易如何进行。 如果发生任何错误/异常,我是否需要回滚,在该错误/异常处将抛出异常并且永远不会到达 commit()调用?如果是这样,为什么以及如何做?究竟回滚是什么?
考虑以下PHP代码(某些Java代码执行类似的操作):
public function deleteAll():void{
$stmt = $this->con->prepare(
'DELETE FROM dd WHERE 1'
);
$this->con->begin_transaction();
if(!$stmt->execute()){
throw new Exception($stmt->error);
}
$this->con->commit();
}
public function insert(array $list):void{
$stmt = $this->con->prepare(
'INSERT INTO dd(cc) VALUES(?)'
);
$stmt->bind_param('s', $v);
$this->con->begin_transaction();
foreach($list as $v){
if(!$stmt->execute()){
throw new Exception($stmt->error);
}
}
$this->con->commit();
}
注意: $ this-> con是mysqli连接对象(不使用PDO,虽然有所不同,但是PDO和mysqli会做类似上面的事情)。 数据库是MySQL,表使用InnoDB引擎。
某些人代码显示他们捕获到异常并进行回滚。但是我没有这样做,因为如果抛出Exception,则永远不会执行 commit()。然后,这让我想知道为什么根本需要回滚。
我的假设是,是否有多个查询同时执行,如下所示:
public function replaceAllWith(array $list):void{
$this->con->begin_transaction();
try{
//do both previous queries at once
$this->deleteAll();
$this->insert($list);
$this->con->commit();
}catch(Exception $e){
//error
$this->con->rollback();
}
}
,但是它仍然无法回滚,因为每个方法/功能都是通过不同的方法和不同的事务来完成和提交的。 第二个问题:我是在每个方法调用中执行每个事务,还是仅在'boss / parent'函数中调用事务,该函数仅调用和协调'subordinate / helper' em>函数可以工作吗?
不确定我是否要问正确的问题。 数据库事务令人困惑,许多在线资源仅显示过程过程(仅提交或随后立即回滚,这与常规直接查询没有区别)而没有涉及OO的概念。请任何专业人士指导并提供一些建议。