一个ID引起的血案
2008-10-15 08:53
211 查看
最近用ASP写程序时,刚开始支持的数据库是ACCESS,程序里有一段代码是往数据库里新添一条记录,方法为先建立一个recordset,然后用addnew和update方法来实现数据新增。addnew之后便能取得新增记录的ID号。
后来程序移植到服务器上时,由于服务器安装的是SQL SERVER 2000,未安装ACCESS,所以不得不把ACCESS数据库转换为SQL SERVER数据库。转换完之后运行发现,在新增记录时,用recordset addnew之后取不到新增记录的ID号,update之后同样取不到ID号。那个郁闷啊,哦使搞的哦。
最后发现数据库里有一个参数@@identity,它的作用是返回最后插入的标识值。用select @@identity语句即可获得最后新增这条记录的ID号。有人可能会问,如果两个客户端同时对服务器的数据库执行新增记录的操作,取得的值会是多少?
对此,作了一个试验:服务器数据库有一表Test,里边有一条记录,ID=1,首先客户端[马云]新添了一条记录,此时Test表新加入的记录ID值为2,select @@identity值显示也为2;然后客户端[比尔·盖茨]新添了一条记录,Test表新增记录的ID值为3,select @@identity值显示为3。这个时候[马云]再执行select @@identity,返回值仍旧是2,令[马云]大吃一惊,令[比尔·盖茨]大跌眼镜!没想到select @@identity只与当前产生的会话有关系,在不同客户端出现并发操作时不会影响某个客户端的@@identity值。
后来程序移植到服务器上时,由于服务器安装的是SQL SERVER 2000,未安装ACCESS,所以不得不把ACCESS数据库转换为SQL SERVER数据库。转换完之后运行发现,在新增记录时,用recordset addnew之后取不到新增记录的ID号,update之后同样取不到ID号。那个郁闷啊,哦使搞的哦。
最后发现数据库里有一个参数@@identity,它的作用是返回最后插入的标识值。用select @@identity语句即可获得最后新增这条记录的ID号。有人可能会问,如果两个客户端同时对服务器的数据库执行新增记录的操作,取得的值会是多少?
对此,作了一个试验:服务器数据库有一表Test,里边有一条记录,ID=1,首先客户端[马云]新添了一条记录,此时Test表新加入的记录ID值为2,select @@identity值显示也为2;然后客户端[比尔·盖茨]新添了一条记录,Test表新增记录的ID值为3,select @@identity值显示为3。这个时候[马云]再执行select @@identity,返回值仍旧是2,令[马云]大吃一惊,令[比尔·盖茨]大跌眼镜!没想到select @@identity只与当前产生的会话有关系,在不同客户端出现并发操作时不会影响某个客户端的@@identity值。
相关文章推荐
- 一个ID引起的血案
- 一个由PROGUARD与FASTJSON引起的血案
- 一个引号引起的血案,ORACLE SQL 分页语句的错误
- 【jsp勘误】一个return引起的血案
- 一个因全局变量引起的DLL崩溃引发的血案
- 一个MySQL-JDBC驱动bug引起的血案……
- 一个“引号”引起的血案!外一则编码引起的超诡异问题
- 一个大对象引起的血案,GC的踩坑实录
- 一个MySQL-JDBC驱动bug引起的血案……
- 一个参数引起的mysql从库宕机血案
- 一个变量定义引起的血案
- 一个空格引起的血案,记在servlet和mysql使用字符串的一次经验
- 一个字符编码引起的血案
- 一个笔误引起的血案
- 一个长事务引起的血案——Informix 长事务回滚失败引起的阻塞故障处理
- 一个斜杠引起的血案
- 一个引号引起的血案
- 一个大对象引起的血案,GC的踩坑实录
- [转载]一个简单问题引起的“血案”(白云黄鹤)
- 一个参数引起的mysql从库宕机血案