为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8
【操作系统】:
【CPU】:
【问题描述】*:
驱动版本:go语言版本
问题:使用数据库创建了一个表然后回滚,发现表还是创建成功了,求教事务的正确打开方式。
简单测试代码如下:
package main
import (
"cindasoft.com/library/entity"
"cindasoft.com/library/slog"
"time"
"database/sql"
_ "dm"
)
//使用新用户重新登录
func createTable() {
dbConfig := &entity.DataSource{
IdleMax: 50,
OpenMax: 100,
Url: "dm://emoa_dns:Youdu123!!@localhost:5237",
DBType: entity.DBNameDM,
}
ydDB, err := sql.Open(dbConfig.DBType, dbConfig.Url)
if err != nil {
slog.Exit("reconnect use emoa_dns error:", err)
}
ydDB.SetMaxOpenConns(dbConfig.OpenMax)
ydDB.SetMaxIdleConns(dbConfig.IdleMax)
ydDB.SetConnMaxLifetime(1 * time.Minute)
slog.Info("re-open youdu ok:", ydDB)
tx, err := ydDB.Begin()
if err != nil {
slog.Exit("begin tx failed:", err)
}
createSql := `
CREATE TABLE t_dns_group (
name varchar(64) NOT NULL,
descprition varchar(255) DEFAULT NULL,
PRIMARY KEY (name)
)`
_, err = tx.Exec(createSql)
if err != nil {
slog.Exit("create table t_dns_group failed:", err)
}
slog.Info("create table t_dns_group ok!!")
err = tx.Rollback()
if err != nil {
slog.Exit("rollback error:", err)
}
slog.Info("rollback db ok!!")
}
func main() {
createTable()
}
同楼上所述,事务已经被提交,回滚无效。与go驱动关系不大。
以下文字摘自《DM8系统管理员手册.pdf》 事务管理 章节:
数据库事务是指作为单个逻辑工作单元的一系列操作的集合。一个典型的事务由应用程序中的一组操作序列组成,对于 DM 数据库来说,第一次执行 SQL 语句时,隐式地启动一个事务,以 COMMIT 或 ROLLBACK 语句/方法显式地结束事务。另外,在执行 DDL 前,DM 数据库会自动把前面的操作进行提交,DDL 前面的操作作为一个完整的事务结束,DDL 语句本身所属事务则根据“DDL_AUTO_COMMIT”配置参数决定是否隐式地提交(注意,无论DDL_AUTO_COMMIT 参数如何设置,ALTER TABLESPACE 和 ALTER USER 操作总是自动提交的)。
建表语句是DDL语句,是自动提交的。
测试事务回滚建议用dml语句,insert,update,delete