go-zero-如何执行mysl事务

connProvider func(ctx context.Context) (*sql.DB, error)

这是一个函数类型字段,存了一个 “能拿到数据库连接池 *sql.DB” 的函数。其中*sql.DB 是 Go 标准库 database/sql 的数据库连接池管理器,内部维护一堆真实 TCP 连接。

为什么调用这个connProvider函数,就能拿到 *sql.DB 对象?

core/stores/sqlx/sqlmanager.go

func newDBConnection(driverName, datasource string) (*sql.DB, error) {
	conn, err := sql.Open(driverName, datasource)
	if err != nil {
		return nil, err
	}
........
	if err := conn.Ping(); err != nil {
		_ = conn.Close()
		return nil, err
	}
	return conn, nil
}

创建并初始化一个标准库 *sql.DB 连接池,然后用conn.Ping()测试数据连接有效性(踩坑经验堆出来的!),因为sql.Open 只管创建内存对象,不建真实连接。