data source name

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
大概长这样:
username:password@protocol(address)/dbname?param=value

为了方便定义数据库源的一种格式化的字符串,
程序用起来还是又要parse又要format的(看下面参考链接里的go实现,复杂+不爽),
也许觉得对人类友好吧,
真的友好吗?

参考链接

https://github.com/go-sql-driver/mysql#dsn-data-source-name
https://github.com/go-sql-driver/mysql/blob/66312f7fe2678aa0f5ec770f96702f4c4ec5aa8e/dsn.go#L246

mysql 事务

InnoDB提供四种事务隔离级别,从低到高分别为READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, 和 SERIALIZABLE, 默认是REPEATABLE READ
InnoDB使用不同的锁策略来支持不同的事务隔离级别.

所有行为都在事务内, 默认是autocommit模式, 每条SQL语句形成一个独立的transaction.

COMMIT意味着变更确定持久化, ROLLBACK意味着放弃尚未持久化的变更, 两个操作都会释放锁.

transaction里select和update两句话之间有可能执行其他transaction的update语句么? || 有可能
在update之前, 这个select的行会被其他transaction读到吗? || 会, 连SERILIZABLE都靠不住

go语言测试

  • 使用_test做为包名做黑盒测试, 使用import . xxx导入要测试的包, 有时为了打破循环引用也需要用这种方式
  • t.Skip(), 当检测到有些测试条件不满足时(比如外部依赖,环境变量没设等情况)可以跳过这个case
  • go test -short, TestCase里用testing.Short判断用户使用了-short参数时,可以做判断跳过耗时的case
  • go test -timeout 1s, 指定耗时, 超时就失败
  • go test -run TestNameRegexp 只执行指定的测试用例
  • t.Parallel() 标记为可以并行测试, 在Test case函数体一开始就调用

参考链接

https://splice.com/blog/lesser-known-features-go-test/