开启事务/结束事务

    /**
     * 开启事务
     * 
     * @param function $callback 可选, 事务之内的业务逻辑, 抛出异常回滚或成功时返回消息
     * @return bool/exception/string 未设置参数时返回true, 出错时返回\Think\Exception异常对象, 成功时返回提示消息
     */
    public static function start($callback = null) {
        D()->startTrans();

        if ($callback && is_callable($callback)) {
            try {
                return $callback();
            } catch (\Think\Exception $e) {
                return $e;
            }
        }

        return true;
    }

    /**
     * 结束事务
     * 
     * @param string/object $msg 可选, 成功时为消息, 出错时为异常对象
     * @param boolean $success 可选, 是否提交事务, 默认true, 设置为false则执行回滚
     * @return bool/exception/string 未设置参数时返回true, 出错时返回\Think\Exception异常对象, 成功时返回提示消息
     */
    public static function end($msg = '', $success = true) {
        // 如果$msg传递为异常类 则抛出错误信息
        if (is_object($msg)) {
            $obj = new \ReflectionClass($msg);

            do {
                if ($obj->name == 'Exception') {
                    $success = false;
                    $msg = $msg->getMessage();
                    break;
                }
            }
            while ($obj = $obj->getParentClass());
        }

        if ($success) {
            D()->commit();
        }
        else {
            D()->rollback();
        }

        $action = $success ? 'success' : 'error';
        return [
            'status' => $action,
            'msg' => $msg
        ];
    }

 

转载于:https://www.cnblogs.com/ningjiabing/p/10552873.html

### 如何在SQL中正确开启事务操作 在 SQL 中,事务的管理通过显式的 `BEGIN TRANSACTION` 或隐式的命令实现。以下是关于如何在 SQL 中正确开启事务的具体说明: #### 显式开启事务 为了确保事务的一致性和可控性,通常推荐使用显式的方式开启事务。这可以通过以下语法完成: ```sql BEGIN TRANSACTION; -- 或者简写为 BEGIN; ``` 在此之后,所有的数据库操作都将作为当前事务的一部分执行,直到该事务被提交或回滚。 #### 提交与回滚事务 - **提交事务**:当所有操作都顺利完成并希望保存更改时,可以使用以下命令提交事务: ```sql COMMIT; ``` - **回滚事务**:如果发生错误或者需要撤销未完成的操作,则可以使用以下命令回滚事务: ```sql ROLLBACK; ``` 这些命令分别对应于永久化事务的结果或将数据库恢复到事务开始前的状态[^3]。 #### 设置隔离级别 在某些情况下,可能还需要调整事务的隔离级别以满足特定需求。例如,在 SQL Server 中,可以通过设置事务隔离级别为快照模式来减少锁冲突的影响: ```sql SET TRANSACTION ISOLATION LEVEL SNAPSHOT; ``` 此命令使得事务内的读取操作基于数据快照进行,从而避免了其他并发事务对其造成影响[^1]。 #### 使用批处理语句 需要注意的是,在同一个事务批次中可以包含多种类型的 DML(数据操纵语言)语句,比如 `INSERT`, `UPDATE`, 和 `DELETE` 等;然而,不应在同一事务批次里混合使用会产生结果集的查询语句(如 `SELECT`),因为这样可能会引发异常情况[^4]。 综上所述,要在一个支持标准 SQL 的环境中启动一个新的事务过程,应当先调用 `BEGIN TRANSACTION;` 来初始化这个新流程,并且依据实际业务逻辑决定何时运用 `COMMIT;` 或者 `ROLLBACK;` 结束整个进程。同时可以根据具体的应用场景适当调节相应的隔离等级参数以便更好地控制资源访问行为以及提升整体性能表现。 ```sql BEGIN TRANSACTION; -- 执行一系列数据库操作... IF (@success = 1) COMMIT; ELSE ROLLBACK; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值