StartMVC开发手册

可以快速上手的开发文档

手册目录

事务操作及维护

事务操作Transaction

方法: transaction(),commit(),rollBack(),inTransaction()

方式一:闭包式事务(推荐)

把「开始事务 → 提交 / 出错回滚」整段交给框架:回调正常返回就自动提交,回调抛异常就自动回滚、并把原异常继续抛出去。方法的返回值就是回调的返回值。

$ok = Db::transaction(function () {
 Db::table('test')->where('id', 10)->update([
 'title' => 'new title',
 'status' => 2,
 ]);

 Db::table('test_log')->insert([
 'action' => 'update',
 'table' => 'test',
 'record_id' => 10,
 'data' => json_encode(['title' => 'new title', 'status' => 2]),
 'time' => date('Y-m-d H:i:s'),
 ]);

 return true; // 返回值原样返回给调用方
});

// 任意一步抛异常 → 自动回滚,异常原样向上抛,数据不会残留
// 回调里也不需要自己写 try/catch 兜底回滚

嵌套调用同样安全:内层抛异常只回滚内层,外层捕获后可以继续提交。

Db::transaction(function () {
 Db::table('test')->insert(['title' => '外层前段']);

 try {
 Db::transaction(function () {
 Db::table('test')->insert(['title' => '内层']);
 throw new Exception('内层失败');
 });
 } catch (Exception $e) {
 // 内层已回滚,外层事务依然有效,可以继续往下走
 }

 Db::table('test')->insert(['title' => '外层后段']);
});
// 提交后:外层前段、外层后段都在,内层那条没有

方式二:手动控制事务

需要在中途做判断、或者事务边界要跨方法时使用。transaction() 开启事务,commit() / rollBack() 结束事务。

// 开始事务
Db::transaction();

try {
 // 执行多个操作
 $data = [
 'title' => 'new title',
 'status' => 2
 ];
 
 // 更新操作
 Db::table('test')->where('id', 10)->update($data);
 
 // 插入操作
 Db::table('test_log')->insert([
 'action' => 'update',
 'table' => 'test',
 'record_id' => 10,
 'data' => json_encode($data),
 'time' => date('Y-m-d H:i:s')
 ]);
 
 // 所有操作成功,提交事务
 Db::commit();
} catch (Exception $e) {
 // 发生错误,回滚事务
 Db::rollBack();
 // 记录错误信息
 Logger::error('事务处理失败: ' . $e->getMessage());
 throw $e; // 可选:将异常继续抛出
}

嵌套事务

事务中再次调用 transaction() 不会重复开启数据库事务,而是打一个 SAVEPOINT:内层 rollBack() 只回滚到保存点,内层 commit() 只是释放保存点 —— 外层一旦回滚,内层已经「提交」的数据同样会消失。

Db::transaction(); // 开启事务
Db::table('test')->insert(['title' => '外层']);

Db::transaction(); // 内层:打 SAVEPOINT
Db::table('test')->insert(['title' => '内层']);
Db::rollBack(); // 只回滚内层

Db::commit(); // 提交外层:外层那条保留,内层那条已消失

查询事务状态inTransaction()

Db::inTransaction(); // false:当前不在事务中

Db::transaction();
Db::inTransaction(); // true

Db::rollBack();
Db::inTransaction(); // false

注意事项

  • 事务必须作用在同一个数据库连接上。框架的 Db::table() 与 Db::transaction() 默认共用同一个实例与连接,直接这样写即可;如果自己用 Db::connect($config) 建了另一个连接,就要在同一连接上开始和结束事务。
  • 没有活动事务时调用 commit() / rollBack() 会返回 false,不抛异常,也不会污染内部的事务计数器 —— 可以放心写在 finally 或兜底分支里。
  • 闭包式事务的参数必须是可调用的;传别的值会抛 InvalidArgumentException。
  • 不要在事务里做耗时操作(如发 HTTP 请求、批量导出),避免长时间持有行锁;也不要往数据库里写日志,框架自身的错误日志走文件。

结构维护Structure

方法有: truncate(),drop(),optimize(),analyze(),check(),checksum(),repair()


// 检查表是否有错误
$result = Db::table('users')->check();
// 优化表结构,整理碎片,提高查询效率
$result = Db::table('users')->optimize();
// 分析表结构,更新统计信息,有助于查询优化
$result = Db::table('users')->analyze();
// 计算表的校验和,用于验证数据完整性
$result = Db::table('users')->checksum();
// 尝试修复损坏的表
$result = Db::table('users')->repair();
// 清空表中的所有数据(比DELETE更快,会重置自增ID)
$result = Db::table('temp_data')->truncate();// 返回影响的行数
// 完全删除表结构和数据
$result = Db::table('old_table')->drop();// 返回影响的行数