【发布时间】:2016-09-02 03:01:56
【问题描述】:
我在另一个函数中使用了一些函数来更新某些内容、删除一些内容并插入,现在我的问题是,如果上面的 2 成功或 1 没有成功,则可能会导致灾难性的结果。那么是否可以对所有 3 个功能使用 1 个事务...例如:
public static function do_stuff()
{
//run sql in function
SELF::function_sql_one_insert();
SELF::function_sql_two_update();
SELF::function_sql_three_delete();
}
像这样:
public static function test()
{
SELF::function_sql_one_insert();
SELF::function_sql_two_update();
SELF::function_sql_three_delete();
}
public static function function_sql_one_insert()
{
//sql to run
$sql = "INSERT INTO table
(
fake_row_one,
fake_row_two
)
VALUES
(
?,
?
)";
//run sql
$fake_insert = $database->prepare($sql);
$fake_insert->execute("yeah", "okay");
}
public static function function_sql_two_update()
{
//sql to run
$sql = "UPDATE table
SET fake_row_one = ?
WHERE fake_row_two = ?";
//run sql
$fake_update = $database->prepare($sql);
$fake_update->execute("blahblah", "okay");
}
public static function function_sql_three_delete()
{
//sql to run
$sql = "DELETE FROM TABLE
WHERE fake_row_two = ?";
//run sql
$fake_delete = $database->prepare($sql);
$fake_delete->execute("okay");
}
我想要完成的是,如果一个失败将它们全部还原。这可能吗?如果不是,我该怎么办,如果可以,这样做有什么缺点吗?
【问题讨论】:
-
是的,您应该能够在运行函数之前启动事务并在之后提交。您可以使内部函数返回布尔成功指标,并在需要时根据这些指标回滚。
-
我应该在 main 函数中开始事务还是在我正在做 sql 的三个函数中开始事务?
-
对此没有通用答案,这取决于您的需求。例如,您是否可能希望调用
test()作为已经开始的一些较大事务的一部分?那么你不应该在那里开始交易。 -
这只是我的看法,但如果不执行所有三个操作可能会导致灾难性结果,我不想创建任何一开始就只执行其中一个的函数。