代码拉取完成,页面将自动刷新
package impl
import (
"context"
"database/sql"
"gitee.com/infraboard/go-course/day14/demo/api/pkg/host"
)
func (s *service) save(ctx context.Context, h *host.Host) error {
var (
stmt *sql.Stmt
err error
)
// 开启一个事物
// 文档请参考: http://cngolib.com/database-sql.html#db-begintx
// 关于事物级别可以参考文章: https://zhuanlan.zhihu.com/p/117476959
// wiki: https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return err
}
// 执行结果提交或者回滚事务
// 当使用sql.Tx的操作方式操作数据后,需要我们使用sql.Tx的Commit()方法显式地提交事务,
// 如果出错,则可以使用sql.Tx中的Rollback()方法回滚事务,保持数据的一致性
defer func() {
if err != nil {
tx.Rollback()
return
}
}()
// 避免SQL注入, 请使用Prepare
stmt, err = tx.Prepare(insertResourceSQL)
if err != nil {
return err
}
defer stmt.Close()
// 生成描写信息的Hash
if err := h.GenHash(); err != nil {
return err
}
// vendor h.Version.String()
_, err = stmt.Exec(
h.Id, h.Vendor, h.Region, h.Zone, h.CreateAt, h.ExpireAt, h.Category, h.Type, h.InstanceId,
h.Name, h.Description, h.Status, h.UpdateAt, h.SyncAt, h.SyncAccount, h.PublicIP,
h.PrivateIP, h.PayType, h.DescribeHash, h.ResourceHash,
)
if err != nil {
return err
}
// 避免SQL注入, 请使用Prepare
stmt, err = tx.Prepare(insertHostSQL)
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(
h.ResourceId, h.CPU, h.Memory, h.GPUAmount, h.GPUSpec, h.OSType, h.OSName,
h.SerialNumber, h.ImageID, h.InternetMaxBandwidthOut,
h.InternetMaxBandwidthIn, h.KeyPairName, h.SecurityGroups,
)
if err != nil {
return err
}
return tx.Commit()
}
func (s *service) delete(ctx context.Context, req *host.DeleteHostRequest) error {
var (
stmt *sql.Stmt
err error
)
// 开启一个事物
// 文档请参考: http://cngolib.com/database-sql.html#db-begintx
// 关于事物级别可以参考文章: https://zhuanlan.zhihu.com/p/117476959
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return err
}
// 执行结果提交或者回滚事务
// 当使用sql.Tx的操作方式操作数据后,需要我们使用sql.Tx的Commit()方法显式地提交事务,
// 如果出错,则可以使用sql.Tx中的Rollback()方法回滚事务,保持数据的一致性
defer func() {
if err != nil {
tx.Rollback()
return
}
}()
stmt, err = tx.Prepare(deleteHostSQL)
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(req.Id)
if err != nil {
return err
}
stmt, err = s.db.Prepare(deleteResourceSQL)
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(req.Id)
if err != nil {
return err
}
return tx.Commit()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。