对于频繁变化的数据,怎么保证它的正确性.例如,多人同时买东西时,余额怎么算?

szuzsq 2017-06-07 10:17:30
例如:我的账户,有个double类型的余额字段..
我账户有买和卖,那对于余额,就是增加和减少.
我余额为400元,卖出一件商品100元,那余额为500元.
买进一件商品200元,那余额为300元.
-----------------------------------------------------------
问题是网站是相当于多线程的,可能多人同时在访问.
2个人同时在买我的东西.我余额为300时,本来一个人,一个人排排队来结算.
那就是
第1人:300+100
第2人:400+100
-----------------------------------------------------------
但如果是同时的话,那会不会变成
第1人:300+100
第2人:300+100
结果我的余额不见了100块.
...全文
498 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
szuzsq 2017-06-12
  • 打赏
  • 举报
回复
引用 13 楼 fdipzone 的回复:
[quote=引用 10 楼 szuzsq 的回复:] [quote=引用 8 楼 fdipzone 的回复:] 数据库会自己加锁的,原子操作那些。
弱弱地问一句,神马是原子操作?[/quote] 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据改操作要全部执行,要么全部不执行。这种特性称为原子性。 http://blog.csdn.net/fengxuezhiye/article/details/7658790 [/quote] 如果我用事务,那么就已经有原子性,一致性,分离性这些特性了么?不需要自己去锁定解锁来实现这些特性的吧?
xuzuning 2017-06-09
  • 打赏
  • 举报
回复
原子操作,就是不能被更高等级中断抢夺优先的操作。你既然提这个问题,我就说深一点。由于操作系统大部分时间处于开中断状态,所以,一个程序在执行的时候可能被优先级更高的线程中断。而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。就是不能被中断的操作。
szuzsq 2017-06-09
  • 打赏
  • 举报
回复
引用 8 楼 fdipzone 的回复:
数据库会自己加锁的,原子操作那些。
弱弱地问一句,神马是原子操作?
傲雪星枫 2017-06-09
  • 打赏
  • 举报
回复
引用 10 楼 szuzsq 的回复:
[quote=引用 8 楼 fdipzone 的回复:] 数据库会自己加锁的,原子操作那些。
弱弱地问一句,神马是原子操作?[/quote] 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据改操作要全部执行,要么全部不执行。这种特性称为原子性。 http://blog.csdn.net/fengxuezhiye/article/details/7658790
Dleno 2017-06-09
  • 打赏
  • 举报
回复
用上锁,并且更新时使用语句字段更新: set amount=amount-100; 不要使用取出的余额值来加减,并发时余额就要错。。 set amount=500-100; 如果要限制余额不能<=0,则更新后,再取余额检查,<=0就回滚数据
傲雪星枫 2017-06-08
  • 打赏
  • 举报
回复
数据库会自己加锁的,原子操作那些。
jacksq 2017-06-08
  • 打赏
  • 举报
回复
引用 8 楼 fdipzone 的回复:
数据库会自己加锁的,原子操作那些。
就是,数据库那里会自己加锁的,你不用担心。
szuzsq 2017-06-07
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
对于 update 数据库会将并发处理转成串行处理 如果不放心,就自己加锁
嗯,估计得找本书来看看.数据库并不是会select,insert,update,delete语句就算懂了的. 太多东西了
xuzuning 2017-06-07
  • 打赏
  • 举报
回复
对于 update 数据库会将并发处理转成串行处理 如果不放心,就自己加锁
szuzsq 2017-06-07
  • 打赏
  • 举报
回复
引用 3 楼 jacksq 的回复:
不会出现,对数据库来说这是两个不同的事务,总有一个先执行,先执行的INSERT或UPDATE时会给表加锁,ISAM加表锁,INNODB加记录锁。再有同一个PHP页面可以被多个人同时访问,他们数据的提交不会出现交叉污染。
我没有在代码里使用数据库的存储过程,事务处理,触发器等. 就是PDO或者mysql_*或者mysqli_*执行一条条语句,也可以么?
jacksq 2017-06-07
  • 打赏
  • 举报
回复
不会出现,对数据库来说这是两个不同的事务,总有一个先执行,先执行的INSERT或UPDATE时会给表加锁,ISAM加表锁,INNODB加记录锁。再有同一个PHP页面可以被多个人同时访问,他们数据的提交不会出现交叉污染。
szuzsq 2017-06-07
  • 打赏
  • 举报
回复
引用 1 楼 lanshs 的回复:
总会后先来后到。若是同时,其中一个等着
我就是有疑虑.因为我之前是做c,c++的.多线程折腾同一个数据时,我们要做线程同步的. 一个人在访问时,锁住,别人就不能访问了,只能先等着. 他做完了,解锁,别人就可以访问了.
lanshs 2017-06-07
  • 打赏
  • 举报
回复
总会后先来后到。若是同时,其中一个等着
xuzuning 2017-06-07
  • 打赏
  • 举报
回复
数据库是一门学问,当然不是增删查改那么简单

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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