我在几个执行查询的方法中使用beginTransaction。但它会运行查询,尽管失败了。有谁知道我的问题在哪里?
我会干掉我的代码只是为了展示基础知识:
方法:
public function __construct()
{
$this->core = db_core::getInstance();
}
function handle_item($action, $item_id)
{
switch($action) {
case 'add':
$this->core->conn->query("INSERT INTO ....");
break;
case 'remove':
$this->core->conn->query("DELETE FROM ....");
break;
}
}
的BeginTransaction
try
{
$this->core->conn->beginTransaction();
$this->handle_item("remove", $item_id);
$this->handle_item("add", $item_id);
$this->core->conn->commit();
catch (PDOException $e)
{
$this->core->conn->rollBack();
echo $e->getMessage();
}
答案 0 :(得分:0)
确保使用PDO :: ERRMODE_EXCEPTION创建数据库以启用例外:
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
也尝试不应该包含catch,它们应该在不同的块中。
try
{
$this->core->conn->beginTransaction();
$this->handle_item("remove", $item_id);
$this->handle_item("add", $item_id);
$this->core->conn->commit();
}//!!!
catch (PDOException $e)
{
$this->core->conn->rollBack();
echo $e->getMessage();
}
答案 1 :(得分:-1)
请勿使用调用函数在INSERT
正文中运行DELETE
和beginTransaction()
。
beginTransaction()
期望在其正文中隐式地看到这些Mysql命令,而不是通过调用函数。因此,在INSERT
和DELETE
之间隐式添加beginTransaction()
和commit()
命令。