# MysqlTransaction

## 功能

MySQL 事务句柄。事务内 SQL 按顺序复用同一个底层事务，适合需要原子提交或回滚的多条 SQL。

## 语法

```bt
tx = mysql(dsn).begin()
tx.query(sql).bind(value).exec()
tx.commit()
```

## 方法

| 方法 | 参数 | 返回值 | 说明 |
| ------ | ------ | ------ | ------ |
| query(sql) | sql:String | MysqlTransaction | 设置事务内 SQL。 |
| bind(value1, value2, ...) | 任意值 | MysqlTransaction | 追加绑定参数。 |
| all() | 无 | Array | 执行查询并返回多行。 |
| one() | 无 | Object/empty | 执行查询并返回单行；没有结果返回 empty。 |
| exec() | 无 | Object | 执行写入 SQL，返回 SQL 执行统计对象；字段见下方。 |
| commit() | 无 | Bool | 提交事务，成功返回 true。 |
| rollback() | 无 | Bool | 回滚事务，成功返回 true。 |
| close() | 无 | Bool | 活动事务会回滚并关闭；已经结束时返回 false。 |
| status() | 无 | String | 返回 active、committed、rolled_back、closed 或 failed。 |
| sql(render_binds) | Bool，可选 | String | 返回 SQL 预览文本；默认渲染绑定参数。 |

## 返回值

| 类型 | 说明 |
| ------ | ------ |
| MysqlTransaction | query/bind 返回新的轻量构建器，但共享同一个事务状态。 |
| Array | all 返回行对象数组。行对象字段见下方“查询行对象字段”。 |
| Object/Empty | one 有结果时返回单行对象；没有结果时返回 `empty`。行对象字段见下方“查询行对象字段”。 |
| Object | exec 返回 SQL 执行统计对象。字段见下方“exec 返回对象字段”。 |
| Bool | commit、rollback、close 的状态结果。 |
| String | status 或 sql 的文本结果。 |

## 查询行对象字段

`all()` 和 `one()` 返回的行对象是动态对象，字段来自 SQL 结果集列名。

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| 任意列名 | Any | 否 | 数据库返回的列值。字段名是结果集列名；字段不存在时读取结果为 `empty`。数据库 NULL 返回 `null`。 |

## exec 返回对象字段

| 字段 | 类型 | 必定存在 | 说明 |
| ------ | ------ | ------ | ------ |
| total | Int | 是 | 本次事务内 `exec()` 处理的绑定行数。事务内暂不支持 `binds()` 批量执行，因此当前固定为 `1`。 |
| rows_affected | Int | 是 | 数据库报告的受影响行数。 |
| last_insert_id | Int | 是 | 数据库报告的最后插入 ID。 |
| batch_count | Int | 是 | 实际拆分执行的批次数。事务内暂不支持批量执行，因此当前固定为 `1`。 |
| batch_size | Int | 是 | 当前执行的批大小。事务内暂不支持 `batch()`，因此当前为 `0`。 |
| workers | Int | 是 | 当前执行使用的并发工作数。事务内按顺序复用同一个底层事务，因此当前为 `1`。 |

## 代码示例

```bt
db = mysql('mysql://user:pass@127.0.0.1/test')
tx = db.begin()
tx.query('update user set name=? where id=?').bind('BT', 1).exec()
status = tx.status()
tx.rollback()

// 输出：active
echo(status)
```

## 注意事项

- 不要并发复用同一个事务对象；事务执行期间再次使用会报错。
- 事务内暂不支持 binds、batch、workers 批量执行配置。
- 未 commit 的事务应调用 rollback 或 close；对象被丢弃时 SQLx 会尝试回滚，但脚本应显式关闭资源。
- `BT.stats().mysql.transactions_active` 可用于观察当前活动事务数量。
