录单还有一个问题,就是如何生成一个不会重复的id。要考虑到数据库、web server都可能有多台,在web和服务器都要注意同步,因此在内存中生成一个id的话,有可能导致重复。
网上有人说用系统时间加几位随机数,还有客户端ip什么的。系统时间不能保证唯一性,客户端ip之类的引入又加大了复杂度。
比较好的方法是在数据库建一张表,只有一条记录,就是nextId。每次需要唯一id时就去读这个表,同时更新nextId。
Tony的方法做了进一步扩展,不是每次取id时都读数据库,而是一次读100个。
在web端,用synchronized限制这个方法,在数据库端,用@Version字段来保证对数据库写操作的顺序(读记录的时候会记住@Version字段的值,写回时将该字段值修改;如果写回时发现该字段值和读的时候已经被一致,说明有别人写过,那么放弃)。
在这个sequence表里可以再加一个type字段,可以为别的用途的唯一id使用。