作者LaPass (LaPass)
看板PHP
标题Re: [请益] 请问关於不重复编号
时间Wed Sep 5 02:18:09 2012
KeyWord 执行绪安全
虽然PHP中没执行绪的概念
但实际上,每一个request就是一条执行绪
先不管这合不合乎「执行绪安全问题」的定义
但这是两个并行的程序存取同一资源时,都会遇到的问题
举例来说,如果程式是这样
1.取得资料库中的序号的最大值
2.将最大值+1
3.存回资料库
现在,最大值是 3
同一时间有A、B条执行绪
执行顺序可能是这样:
A1 取得3
A2 +1 成为 4
B1 取得3
A3 存回,序号为4
B2 +1 成为 4
B3 存回,序号为4
一般状况下,执行的顺序是由作业系统在管理
没办法保证执行的顺序
这在有些状况下会出大问题,例如金融转帐之类的
这时候,一般程式都会有一套方法去保证他的执行顺序、资源安全性
通常是叫做原子操作(英文叫做Atomic之类的)、同步(synchronized之类的)
但很抱歉,PHP中没这个东西,至少我没看到过,所以要从资料库下手
另外不要以为把sql写在同一行就能够保证不会出现这种问题
资料库内部也是有很多执行绪在跑SQL命令的
所以也可能会出错
资料库叫这种行为叫做交易模式(transaction)、锁定(LOCK)之类的
简单来讲,就是有人打算写东西进去时,把那个资料表给锁住,不让别人读、写
直到操作结束才释放
以及,一连串的动作都成功时,才会让命令生效
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.38.75.74