C# ID生成器的递增计数器

C# ID生成器的递增计数器,c#,mysql,C#,Mysql,情景: 我有这种情况,在电影院的售票亭,有两个顾客去了1号亭,另一个去了2号亭。他们在同一家电影院看电影。数据库中记录的最后售出的票系列是87990,当2个POS(安装在售票亭中)得到最后一个票系列时,他们得到了87990,因此给2个客户的票是相同的;这是87991。如果两台计算机同时执行事务,则会出现这些问题 过程如下: lastticket = getlastticket(); //get lastticket series updatelastticket(lastticket

情景:

我有这种情况,在电影院的售票亭,有两个顾客去了1号亭,另一个去了2号亭。他们在同一家电影院看电影。数据库中记录的最后售出的票系列是87990,当2个POS(安装在售票亭中)得到最后一个票系列时,他们得到了87990,因此给2个客户的票是相同的;这是87991。如果两台计算机同时执行事务,则会出现这些问题

过程如下:

lastticket = getlastticket();      //get lastticket series
updatelastticket(lastticket + 1);  //update counter
我想问一下,你能否就如何解决这个问题提出一些建议


目前,我所拥有的只是一个数据库,其中保存了每家电影院最后售出的系列票。

删除updatelastticket()的参数


我的意思是,更新票证id然后返回

如果无法锁定数据库中的表或使用自动增量类型列,是否可以编写一个小型的网关守护程序,作为对数据库中该行的唯一访问,并让两个POS系统调用该守护程序,而不是POS系统直接调用DB?然后守护进程可以序列化请求。

听起来像是同步问题。使用锁怎么样?在选择最后一个票证系列后,您需要
读取该字段,直到它被更新。然后,第二个SELECT查询将在执行之前等待该更新。最好的方法取决于你的MySQL引擎。@rechie:也许可以发布一些关于票据发行过程的代码。基本上把这里所有的评论结合起来;通过锁定表,使行id自动递增,并使读取+更新(或读取+插入)操作成为原子操作。如果不可能,则最好的选择是自动递增,如果不可能,则您确实需要计算locking@rechie请求将等待,直到释放锁。感谢您的响应。但是在不锁定表的情况下,在选择最大票证id之前,可能会有一些查询更新最后的票证@请注意,你是对的。锁定表格,进行更新,选择,…等,然后移除锁定。。
public int updatelastticket()
{
UPDATE   Ticket_Table SET Ticket_ID = Ticket_ID + 1;
int last_ticket_id = SELECT MAX Ticket_ID FROM Ticket_Table;
return last_ticket_id;
}