MYSQL在工作中的应用

1、事务

(1)多表操作,必须开启事务
(2)数组存储db可以使用json序列化。主要是考虑json是比较通用的数据格式,如果使用分隔符拼接必须单独约定一个分隔符。

choiceStr += fmt.Sprintf("%v,", choice)
strings.TrimRight(choiceStr, ","),

==>

choiceByte, err := json.Marshal(field.Choice)
choiceStr := string(choiceByte)

⚠️注意:把一个数组存入数据库,有两种方式
a.用字符串拼接,但是要与前端约定每个数组之间的分隔符
b.用json序列化,再转换成字符串(这种更好)
(3)数据库事务回滚是建立在同一个数据库对象上,因此获取orm对象时必须使用单例模式,防止存在多线程、多进程的使用。
(4)数据库事务相当于对数据库中数据的操作加锁
(5)Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务

MySql中的事务嵌套
1、Mysql中的事务必须是InnoDB、Berkeley DB引擎,myisam不支持。
2、Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务。
3、Mysql默认是autocommit=1,也就是说默认是立即提交,如果想开启事务,先设置autocommit=0,然后用START
TRANSACTION、 COMMIT、 ROLLBACK来使用具体的事务。
4、fastapp的事务嵌套,原理和代码都很简单,使用了一个trans_count的变量来标识当前事务的层级,默认为0,每次调用开启事务时计数器加1,事务提交或者回滚时,计数器减1。当计数器为0时,认为是最外层事务时实际触发mysql的事务操作。
5、 事务控制要成对出现,有开启,必有提交和回滚,如果不匹配导致事务计时器错误,偏离预期的控制效果
6、事务一般配合try catch异常处理语句一起实现,try包裹的语句体内,如果有错误,应该主动抛出异常,在catch内进行回滚操作,而不能直接在异常处回滚

https://www.cnblogs.com/tongx/p/4936253.html
(6)mysql 报错mysql busy buffer
现象:开启事务后,采用协程去操作多张表
原因:因为事务过程只有一个连接,事务内的操作都是顺序执行的,在开始下一个数据库交互之前,必须先完成上一个数据库交互
https://www.cnblogs.com/kaichenkai/p/11156671.html

2、go中使用原生的sql

(1)原生的sql语句注意特殊情况
例如where in()为空的情况
(2)原生的sql都要进行打印,以免出现错误,而不知道错误原因

3、OSS存储

OSS存储是大对象的服务

4、mysql将读取的表数据插入表中

减少循环用原生的sql插入
sql := "insert into app (app_id, name, `desc`, expression) select ? as app_id, name, `desc` , expression from app where app_id = ? and is_deleted = 0 order by id"


//使用map找出old数据与新数据的对应关系,用order by id
sql = "select id from app where app_id in (?, ?) and is_deleted = 0 order by id"
length := len(allTemplates) / 2
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值