mysql 事物小测试

        $goodsModel = M('mall.Goods');
        $usermodel = M('user.User');
        $shopModel = M('mall.Shop');
        
        try {
            //事物不能跨库 有一个model使用事物则必须都使用事物 同库下一个事物即可 中途修改的值立即生效 出现异常则rollback
            $goodsModel->beginTransaction();
            $usermodel->beginTransaction();
            $goodsModel->updateById(['StockCount'=>500], 80);
            $shopModel->updateById(['GoodsCount'=>10], 100274);
            $usermodel->updateById(['Money' => 7], 3);
            
            echo $goodsModel->fetchById(80)['StockCount'];//500
            
            throw new \Exception('interupt', 211);
            
            $goodsModel->commit();
            $usermodel->commit();
            die('modify success!');
        } catch (Exception $e) {
            $goodsModel->rollback();
            $usermodel->rollback();
            echo $e->getMessage();
        }

如果goodsModel 和userModel 使用的PDO对象是同一个 则属于同一事物
反之为2个事务 ,这也是为什么在mysql控制台测试时 事物可跨库的问题

PDO多事务程序处理:
    protected $transactionCounter = 0;
    function beginTransaction() {
        if(!$this->transactionCounter++)
            return parent::beginTransaction();
        return $this->transactionCounter >= 0;

    }

    function commit() {
        if(!--$this->transactionCounter)
            return parent::commit();
        return $this->transactionCounter >= 0;
    }

    function rollback() {
        if($this->transactionCounter >= 0) {
            $this->transactionCounter = 0;
            return parent::rollback();
        }
        $this->transactionCounter = 0;
        return false;
    }


### 测试数据库主从复制延迟 数据库主从复制延迟的测试通常可以通过监控从库的 `Seconds_Behind_Master` 指标来实现。该指标表示从库应用主库的二进制日志(binlog)时的延迟时间(以秒为单位)。可以通过以下 SQL 查询获取该值: ```sql SHOW SLAVE STATUS\G ``` 在输出中查找 `Seconds_Behind_Master` 字段,它表示从库落后主库的时间(以秒为单位)[^5]。 此外,还可以通过以下方式进一步验证主从延迟: - **插入时间戳数据**:在主库上插入带有时间戳的数据,然后在从库上查询该数据,并计算当前时间与时间戳之间的差值,从而得到延迟时间。 - **使用工具**:例如 `pt-heartbeat`(Percona Toolkit 的一部分)可以持续监控主从延迟,并提供更精确的结果。 --- ### 测试事务一致性 事务一致性是指主库和从库在事务提交后数据状态是否一致。以下是几种测试事务一致性的方法: 1. **使用校验工具**: - `pt-table-checksum` 是 Percona 提供的一个工具,用于检测主从数据一致性。它通过在主库上执行校验任务,并在从库上比较结果来检测数据是否一致[^5]。 - 示例命令: ```bash pt-table-checksum --host=master_host --user=checksum_user --password=checksum_password ``` 2. **手动测试事务一致性**: - 在主库上执行一组事务性操作(如插入、更新、删除),然后在从库上查询这些数据,确保数据已经同步。 - 示例 SQL: ```sql -- 主库操作 START TRANSACTION; INSERT INTO test_table (id, value) VALUES (1, 'test'); COMMIT; ``` 在从库上执行: ```sql SELECT * FROM test_table WHERE id = 1; ``` 如果查询结果包含新插入的数据,则表示事务一致性良好。 3. **启用 GTID 和 ROW 格式**: - 确保主从复制使用 GTID(全局事务标识符)和 ROW 格式的二进制日志,这样可以更精确地追踪事务的执行情况,避免因 SQL 执行顺序问题导致的一致性问题[^4]。 4. **半同步复制测试**: - 启用半同步复制后,主库在提交事务时会等待至少一个从库确认接收到事务日志,从而确保数据在主从之间的一致性。 - 可以通过以下 SQL 查询确认是否启用了半同步复制: ```sql SHOW VARIABLES LIKE 'rpl_semi_sync_%'; ``` --- ### 优化主从延迟和事务一致性的建议 - **启用半同步复制**:确保至少一个从库接收到事务日志后再提交,减少数据丢失风险[^4]。 - **使用 GTID 和 ROW 格式**:提高事务追踪的准确性,避免 SQL 执行顺序问题导致的数据不一致[^4]。 - **定期执行一致性校验**:使用 `pt-table-checksum` 定期检测主从数据一致性,及时发现并修复问题。 - **监控主从延迟**:通过 `Seconds_Behind_Master` 或 `pt-heartbeat` 实时监控延迟,确保系统在可接受范围内运行。 - **升级到 MySQL 8.0+**:利用其改进的复制机制(如并行复制、增强的 GTID 支持)提升性能和一致性保障。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值