GORM查询条件之不定参数的用法

为了根据用户ID(UserID)获取到相应的话题(Topic),我们定义了一个QueryByUserID 的方法,为了表意刻意传入了一个参数,同时在QueryByUserID的最后强行添加了一个args不定参数,从而接受调用时传入的附加的参数,在函数体内根据args的长度对它进行不同方式的应用,达到了优雅扩展QueryByUserID的功能。

Read More

MySQL share mode和for update读锁的区别和应用场景分析

读锁的概念和区别

如果在MySQL的事务里查询数据,然后在同一事务中插入或更新相关数据,常规的SELECT语句不能提供足够的保护。其他并行的事务可以更新或删除第一个事务里刚查询的相同行。 InnoDB支持两种类型的读锁,提供了额外的安全性:

  • SELECT … LOCK IN SHARE MODE

    在读取到的行上设置共享锁。其他会话可以读取行,也可以继续给行加共享锁,但是在当前事务提交之前其他会话不能修改加了共享锁的行。如果这些行中的任何一个被尚未提交的另一个事务更改,则当前查询将等待直到该事务结束,然后使用最新值。

  • SELECT … FOR UPDATE

    用排他锁锁定行和任何关联的索引条目,就像在这些行上执行UPDATE语句一样。禁止其他事务在这些加了锁的行上进行UPDATE、执行SELECT ... LOCK IN SHARE MODE或者读取某些事务隔离级别的数据。

通过对比,发现FOR UPDATE的加锁方式类似并发编程里的写锁,而LOCK IN SHARE MODE则是读锁,同一时间点相同的行上只允许出现一个写锁,或者是多个读锁。一旦有一种锁在数据行上成功加上了锁,另外一种加锁尝试就会进入等待。

Read More

并发编程-通道使用

1.什么是Channel?

channelGo的通道,是协程之间的通信机制。一个channel是一条通信管道,它可以让一个协程通过它给另一个协程发送数据。每个channel都需要指定数据类型,即channel可发送数据的类型。Go语言主张通过数据传递来实现共享内存,而不是通过共享内存来实现数据传递。

Read More

Go 监听信号退出并回收资源

为什么取这个名字,而不是直接写优雅退出呢?

实际上我一直觉得优雅退出这个名字并不直观,而优雅退出的本质,其实就是监听一些操作系统信号。在监听到退出信号的时候,可以做一些资源回收的操作,而不至于什么都不管直接退出,等到操作系统自己去处理回收这些资源。

Read More