日期:2014-05-17  浏览次数:20481 次

关于同时操作数据库的问题请教。
小弟在实际开发过程中,遇到过的一些问题,请教下各位高手。
请高手们给一些解决方案。

问题1:(关于对数据库进行同时查询操作,要求查询到的结果不重复)
  多个用户同时在一个订票网站上订票,如何保证每个用户订到的票的编号都不一样?
问题2:(关于多人同时更新同一数据库的同一表的同一字段问题)
  多个用户同时登陆论坛系统,然后要对论坛在线人数进行+1的更新操作,如何解决同时更新的冲突?
问题3:(关于对数据库同时插入操作)
  多个用户同时在论坛里进行发帖,如何才能保证插入数据库操作不冲突,并且生成贴子的ID是递增的呢?
问题4:(关于同时删除数据的问题)
  论坛同一板块的2个版主,同时删除一个帖子,应该怎样处理这样的冲突?

以上问题在 MSSQL 和oracle里都会遇到,是否在这2种数据库中的解决方案也不同?

请各位高手不吝赐教。

------解决方案--------------------
问题1,尝试解答,每次随机取出一张票,然后将该票号更新为已售出,如果更新成功,并且影响的行数是1行,则成功,否则,重复上边的操作,这个我的想法,未实际操作过。
问题2,数据库都会自动处理的,update t set 在线人数=在线人数+1,数据库处理的时间应该很短,真的在同一毫秒中提交该命令的会有多少呢?如果真的是同时,因为有字段锁,第一条语句未更新完毕,第二条是处于等待状态的,如长时间等待估计会返回执行错误的信息的,程序中根据执行结果,确定是否再次执行该语句。如果真是很多客户端多次提交命令,数据库反应不过来,就当机了吧。
问题3,同样,数据库表的字段设置自增列,插入时,自增列不用赋值,数据库自动产生的值,不存在冲突的问题。
问题4,同问题2,数据库会有行锁的,第一语句处理该行的时候,第二个语句是等待的。第一条语句删除成功,执行结果是成功,影响行数1行,第二条语句再删除的时候,执行结果也是成功,影响行数0行而已。
------解决方案--------------------
问题1:(关于对数据库进行同时查询操作,要求查询到的结果不重复)
多个用户同时在一个订票网站上订票,如何保证每个用户订到的票的编号都不一样?
  查询与订票没有任何关系吧,当在订购的时候判断是否存有序号

问题2:(关于多人同时更新同一数据库的同一表的同一字段问题)
多个用户同时登陆论坛系统,然后要对论坛在线人数进行+1的更新操作,如何解决同时更新的冲突?
首先将查询的表结构及其当前记录记录在缓存中,在保存的时,在数据库中出抓取当前ID对应的记录匹配,是否与数据中的记录一致,如一致提交,不一致报提示

问题3:(关于对数据库同时插入操作)
多个用户同时在论坛里进行发帖,如何才能保证插入数据库操作不冲突,并且生成贴子的ID是递增的呢?
  在提交数据的时候,对ID递增

问题4:(关于同时删除数据的问题)
论坛同一板块的2个版主,同时删除一个帖子,应该怎样处理这样的冲突?
同样判断ID是否存在数据库中,在数据库中执行删除,不在报提示



------解决方案--------------------
其实你的问题应该是Lost update。可以修改数据库隔离级别或者参考http://blog.csdn.net/smithliu328/article/details/7763972