【发布时间】:2016-11-18 13:06:51
【问题描述】:
我正在开发一个计费系统(C# 代码、MySQL Galera Cluster 后端、InnoDB 存储引擎),并且对如何为发票生成真正唯一的序列号存有疑问。
通常在其他系统中,我创建了一个独特的服务来获取发票编号,每当生成发票时,我都会向该服务询问一个编号,并且该服务保证了对持有柜台的桌子的独占访问权,因此不会完全有问题。
但是这个新系统是集群化的以实现高可用性,所以这种方法是不可接受的,因为需要运行多个这样的服务。
所以我在这里应用的逻辑是这样的:
- 开始交易
- 创建没有序列号的发票
- 检索串行计数器
- 将新计数器写入表
- 更新发票
- 提交
如果我没记错的话,如果其他事务在当前事务完成之前更新了计数器,那么提交将抛出异常,然后我可以重试该操作,这将确保发票编号的顺序。
所以我的问题是,哪一个是实现此目的的正确隔离级别? READ_COMMITED 是否足够或可能会产生重复项?或者有更好的方法来解决这个问题?
【问题讨论】:
-
为什么投反对票?
-
你的意思是 NDB 集群吗?加莱拉集群?还是其他口味?
-
这是一个galera集群
标签: c# mysql transactions innodb galera