我对使用http://php.net/manual/en/pdo.begintransaction.php
中描述的数据库类感兴趣但是该类有一个问题,它使用的是非$transactionCount
属性,这意味着如果我有多个类开始事务,它将导致多次提交并使我的代码最终出错,看看这个示例(不可运行,只是为了理解):
class Field extends Database {
public function createFieldToForm( $fieldName, $formId )
{
// static transactionCount = 0
// transactionCount = 0
$this->beginTransaction();
// .... createFieldToForm code ....
$last_id_new_fieldName = $this->insert( $fieldName );
$formFields = new FormFields();
$formFields->assignFieldToForm( $last_id_new_fieldName, $formId );
$this->commit();
}
public function insert( $fieldName )
{
try {
// static transactionCount = 1
// transactionCount = 1
$this->beginTransaction();
$dbh = Database::getDatabaseConnection();
$dbh->prepare( "INSERT INTO form(fieldname) VALUES (:fieldname)" );
// ... bind ...
$dbh->execute();
$this->commit();
return $dbh->lastInsertId();
}
catch (PDOException $e) {
$this->rollback();
}
}
}
class FormFields extends Database {
public function assignFieldToForm( $idFieldName, $formId )
{
// static transactionCount = 1
// transactionCount = 0
$this->beginTransaction();
// ... assign the created field to the form ....
$this->insert( $idFieldName, $formId );
$this->commit();
}
public function insert( $idFieldName, $formId )
{
try {
// static transactionCount = 2
// transactionCount = 1
$this->beginTransaction();
$dbh = Database::getDatabaseConnection();
$dbh->prepare( "INSERT INTO form_fields(idfield,formid) VALUES (:idfield,:formid)" );
// ... bind ...
$dbh->execute();
$this->commit();
}
catch (PDOException $e) {
$this->rollback();
}
}
}
const FORM_USER_INFORMATION = 3;
$fieldPhone = new Field();
$fieldPhone->createFieldToForm( "phone_number", FORM_USER_INFORMATION );
正如您在此代码的注释中所看到的,如果$transactionCount
的值是静态的,则createFieldToForm
的值非常不同,但此问题的主要内容是关于静态属性,如果它的值可能是可以在执行(例如)trait Foo[A, B] {
// implementation details not important
}
期间由另一个代码线程/函数或外部调用更改。你可以向我推荐什么呢?
答案 0 :(得分:2)
此类不是来自PHP手册,而是来自 comments 到手册页。这使得故意不可靠的来源。
要解决您的问题,只需摆脱所有这些"交易"。因为仅对单个查询使用事务是没有意义的。
因此,你很可能根本不需要交易,也不需要柜台,也不需要这个类。