LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 649|回复: 5

有些问题没人提起。

[复制链接]
发表于 2003-6-2 09:09:06 | 显示全部楼层 |阅读模式
1、一个新用户注册页面,程序逻辑如下:
a、获取用户输入的登录名、密码;
b、查找数据库判断是否存在相同的用户名;
c、如果不存在同名用户,则插入此新用户的信息(登录名、密码)。

假设两个客户端(1、2)同时请求此页面,尝试使用相同的用户名注册(比如说:aaa,且此名不在数据库中),问是否可能产生以下执行序列:1a 2a 1b 2b 1c 2c 。 (1b表示服务器执行1号客户端的b 语句)。


2、如果以上执行序列可能存在,那么在使用数据库时就必须考虑加锁。如果上述执行序列可能,那么就有可能产生死锁。如何解决?
发表于 2003-6-2 09:26:58 | 显示全部楼层

???有些问题不必提起。

这个也需要考虑么?考虑的太多了吧。
1c执行成功之后执行2c,2c的返回结果是插入失败,告诉用户说:对不起,该用户名已经存在,请换别的名字吧!
就是如此阿,哪里需要锁什么东西。莫非你的数据库执行不正确的插入语句后会死掉而不是抛出错误信息?那... ... 你换个数据库好了。不要将问题复杂化,自己会把自己吊死。
发表于 2003-6-2 12:20:51 | 显示全部楼层
这种事情在数据库中不可能发生。因为数据库是事务处理的。对于向数据库中插入数据,所有的操作要么全部成功。要么一次也不执行。不可能只执行事务处理的部分操作。如果在执行过程中发生意外,如down机之类的。数据库会根据记录,取消已经执行的部分操作,保证数据库的状态完全恢复到没有执行操作前的状态。
 楼主| 发表于 2003-6-2 13:52:26 | 显示全部楼层

再次请教两位。

To superbug :
其实我要知道的问题是:web服务器(apache)调用页面时,是不是一次完成一个页面中的所有程序逻辑?而不象我在上贴中描述的那样,两个页面的程序相互干扰。


To kj501:
Mysql不支持事务处理,因此如果两客户端直接用sql语句操作数据库(比如上贴中的1b 2b 1c 2c),则可能同时插入成功。


注:并未将字段描述为值唯一,不重复要靠php程序逻辑去判断。
发表于 2003-6-2 14:18:44 | 显示全部楼层
{Q:
  To superbug :
  其实我要知道的问题是:web服务器(apache)调用页面时,是不是一次完成一个页面中的所有程序逻辑?而不象我在上贴中描述的那样,两个页面的程序相互干扰。}

apache执行php的过程是(如果你指的是lamp的组合),诸多httpd进程中的一个接受客户请求(request可能是get或者post),发现请求的是php页面,于是将请求作为参数,呼叫php引擎对php页面中的代码进行解析执行,要求php引擎返回结果给自己,最后将结果回传给客户的浏览器。而php文件中的相关操作都是一次执行完毕的,包括对数据库的操作等。

上述整个过程是一次事件(客户发送请求)之中发生的,和其它事件无关;平时apache就静静的等在那里(无状态),等待有事件来触发它执行一系列的操作。两个客户对相同页面的两次访问是两个事件,被apache分别独立执行,它们之间的沟通点可能只是操作了相同的数据库中的记录而已。http协议是无状态的,这点很重要。

你所描述的情况其实需要你的数据结构上加以处理,即用户数据表中的uid或username什么的字段要唯一。如果全靠php来判断,完全不靠数据库的能力,那还真是个问题 不过,好像不会有人这么用吧?除非,自己和自己过不去

btw,如果你用的是mysql4,那你该多看看mysql4的文档。InnoDB表是支持事务的,虽然性能上有一些牺牲。
 楼主| 发表于 2003-6-2 15:58:23 | 显示全部楼层
谢谢楼上!
真是世上本无事,庸人自扰之。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表