为不支持事务的数据库实现Golang database/sql/driver

为不支持事务的数据库实现Golang database/sql/driver 我正在为一个不支持事务的数据库编写一个新的 database/sql/driver。在线文档对于接口的预期行为描述不明确。例如,ConnBeginTx.BeginTx 应该返回一个错误,还是应该表现得好像创建了一个事务,即使该事务的 Rollback 和 Commit 操作毫无意义?我怀疑是前者,但是否有一个惯用的错误可以返回,例如 driver.ErrSkip(根据"ErrSkip 仅在明确文档支持的地方使用"的说明,这并不合适)。

2 回复

默认情况下返回一个错误,表明不支持事务,但同时也在连接字符串中提供一个参数,允许驱动程序抑制该错误,这是否符合惯用做法或只是明智之举?这将允许用户切换到该驱动程序并使用可能已包含 BeginTx 调用的代码。用户必须通过将连接字符串参数设置为 true 来明确确认缺乏事务行为。

更多关于为不支持事务的数据库实现Golang database/sql/driver的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于不支持事务的数据库实现 database/sql/driver,正确的做法是在 ConnBeginTx.BeginTx 方法中返回一个错误。driver.ErrSkip 不适用于此场景,因为它仅用于特定情况(如扫描器接口)。相反,你应该返回一个明确的错误,表明事务不被支持。

以下是一个实现示例:

import (
    "database/sql/driver"
    "errors"
)

var ErrNoTransactionSupport = errors.New("transactions are not supported by this driver")

type Conn struct {
    // 你的连接字段
}

func (c *Conn) Begin() (driver.Tx, error) {
    return nil, ErrNoTransactionSupport
}

func (c *Conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
    return nil, ErrNoTransactionSupport
}

这样,当应用程序尝试开始一个事务时,会收到明确的错误信息。database/sql 包会相应地处理这个错误,确保调用方能够识别事务支持缺失的情况。

回到顶部