关于并发访问的数据同步问题

muqingren1978 2011-02-25 09:28:58

我现在准备做一个影院售票系统
现在就并发访问的数据同步问题很是头疼,不知道怎么做才最好,来坛子像各位朋友求助,希望多给建议,谢谢
场景描述:

A、B两个售票终端,售票流程是先锁定座位,然后再售出座位。A端口和B端口同时售票时,我想用同步方法在业务流进行锁定,但是效率很低啊,耗时至少是没用同步锁的5倍,朋友们有没有更好的办法?数据库锁会不会效率高些?

谢谢,我没有分了,就70分了,全部散了吧
...全文
295 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
paneyjiang 2011-04-07
  • 打赏
  • 举报
回复
妈呀这也可以得40分
muqingren1978 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 fulong258 的回复:]

进入事务模式,COMMIT提交更新请求,如果执行成功则返回成功状态,如果失败就会ROLLBACK,回滚到执行前状态
[/Quote]

非常感谢,给分结贴
0轰隆隆0 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 muqingren1978 的回复:]

太感谢了
因为我要做一个售票系统,所以我应该用悲观锁才行的吧?
实话实说,我还是不太想锁表,我怕出个异常啥的就废了
[/Quote]

进入事务模式,COMMIT提交更新请求,如果执行成功则返回成功状态,如果失败就会ROLLBACK,回滚到执行前状态
jippo08456 2011-03-24
  • 打赏
  • 举报
回复
不用锁吧 给座位一个是否售出的状态 售出的时候同步一下此状态
muqingren1978 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 fulong258 的回复:]
在业务层加锁不可取

现在主流的数据库都支持事务模式,加上悲观锁,更高级的不但有表锁定,还有行锁定

使用COMMIT和ROLLBACK就可以了,没有必要那么麻烦!根据返回执行状态判断是否提交成功!

金融级别的如ATM取款机的处理方式也不外乎这些
[/Quote]

谢谢,但我的数据库是MySQL的,这个性能是不是还不如用synch***关键字呢?
muqingren1978 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 qm4050 的回复:]
如果是B/S ,Oracle的话,用数据库锁吧,它本身就有这个功能了。它有行级锁和表级锁,可以满足需要了
[/Quote]


我的数据库是MySQL,用数据库锁是不是效率很低下啊????
muqingren1978 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 fulong258 的回复:]

不会的,MYSQL数据库,你要设置为InnoDB,不然不支持事务模式!对于效率的话,那就是鱼和熊掌,每个数据库……
[/Quote]

太感谢了
因为我要做一个售票系统,所以我应该用悲观锁才行的吧?
实话实说,我还是不太想锁表,我怕出个异常啥的就废了
0轰隆隆0 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 muqingren1978 的回复:]

引用 27 楼 qm4050 的回复:
如果是B/S ,Oracle的话,用数据库锁吧,它本身就有这个功能了。它有行级锁和表级锁,可以满足需要了


我的数据库是MySQL,用数据库锁是不是效率很低下啊????
[/Quote]

不会的,MYSQL数据库,你要设置为InnoDB,不然不支持事务模式!对于效率的话,那就是鱼和熊掌,每个数据库都一样,包括Oracle,MSSQL等等!不推荐在业务层同步控制!如果程序有BUG,全盘都会当掉,效率要远远低
qm4050 2011-03-19
  • 打赏
  • 举报
回复
如果是B/S ,Oracle的话,用数据库锁吧,它本身就有这个功能了。它有行级锁和表级锁,可以满足需要了
0轰隆隆0 2011-03-14
  • 打赏
  • 举报
回复
在业务层加锁不可取

现在主流的数据库都支持事务模式,加上悲观锁,更高级的不但有表锁定,还有行锁定

使用COMMIT和ROLLBACK就可以了,没有必要那么麻烦!根据返回执行状态判断是否提交成功!

金融级别的如ATM取款机的处理方式也不外乎这些
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 bao110908 的回复:]
如果并发量很高,那就得使用数据库级别的悲观锁。如果并发量只是突然并不是经常发生的话,可以使用数据版本号式的乐观锁。
[/Quote]

这个说得很好
muqingren1978 2011-03-14
  • 打赏
  • 举报
回复
并发和并发性能这块,还希望有更多的资料出现,谢谢
muqingren1978 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 cl61917380 的回复:]
http://www.blogjava.net/loocky/archive/2006/11/15/81138.html

mark!
[/Quote]


这个资料很好,结贴时一定给分
muqingren1978 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dracularking 的回复:]
锁不仅提供了对写操作的排他性,(就是在一个线程对数据进行写操作的时候,不允许其他线程同时对同一数据进行写操作),也阻止或控制了对未完成修改的数据的读操作,也叫作未提交数据。也就是写前可读,写中不可读,写完可读;读前可写,读中不可写(我不清楚有没有读中概念,如果读是一个原子操作的话,就没有读中概念,也不存在读中不可写的问题),读完可写。

再看下具体操作
http://www.cnblogs.……
[/Quote]


非常感谢,结贴时一定给分
dracularking 2011-03-09
  • 打赏
  • 举报
回复
锁不仅提供了对写操作排他性,(就是在一个线程对数据进行写操作的时候,不允许其他线程同时对同一数据进行写操作),也阻止或控制了对未完成修改的数据的读操作,也叫作未提交数据。也就是写前可读,写中不可读,写完可读;读前可写,读中不可写(我不清楚有没有读中概念,如果读是一个原子操作的话,就没有读中概念,也不存在读中不可写的问题),读完可写。

再看下具体操作
http://www.cnblogs.com/lingmaozhijia/articles/1339222.html
paneyjiang 2011-03-09
  • 打赏
  • 举报
回复
这样看可以解决不:你肯定有一张表来存储你的票资源,如果是采用的oracle数据库的话,解决方法:当你要买这张票的时候,先锁定这张票,select card from filemcard where carno='当前要买的票' for update,
然后进行你后面的其他操作,这样,当你锁定了这样卡后,其他窗口就不会再来买这张票了

这样操作应该可以解决吧,希望对你有帮助
ilrxx 2011-03-09
  • 打赏
  • 举报
回复
数据库分为行锁和表锁,行锁一般都是for update,在事务中执行。保证事务原子性的
muqingren1978 2011-03-09
  • 打赏
  • 举报
回复
没人啊?问给谁啊?
coooliang 2011-03-09
  • 打赏
  • 举报
回复
http://www.blogjava.net/loocky/archive/2006/11/15/81138.html

mark!
  • 打赏
  • 举报
回复
如果并发量很高,那就得使用数据库级别的悲观锁。如果并发量只是突然并不是经常发生的话,可以使用数据版本号式的乐观锁。
加载更多回复(11)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧