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