免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: leera
打印 上一主题 下一主题

多进程多线程大批量插入操作情况下LAST_INSERT_ID函数返回值误差的解决办法 [复制链接]

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2006-03-10 11:38 |只看该作者
mysql_insert_id函数是基于当前数据库连接session的 。

只要不是两个程序共享同一个数据库的连接,mysql_insert_id就不会出错。

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2006-03-10 11:38 |只看该作者
很多人都说过很多和锁表相关的话题, 比如大量的insert和update时候要锁表。


如果数据库连简单的更新插入都需要锁表, 那还不如使用文本文件做数据库

论坛徽章:
0
13 [报告]
发表于 2006-03-10 11:44 |只看该作者
^_^,我一定会做个测试方案
在这之前我,我决定用这个存储过程来确保不会出错

我的解决方案是这样的 , 为我的数据库创建一个控制表,记录所有的表名,然后搞一个int字段在里面。
在我所有的insert操作之前,先调用这个存储过程,从这个控制表读出这个表的最新insert id+1并且以x方式锁定,最后commit释放,这样就绝对不会出错了。并且这个存储过程以后可以移植到其他数据库上面,比如sqlserver。

mysql> select * from newid;
+----+-----------+---------+
| pk | tablename | tablepk |
+----+-----------+---------+
|  3 | c         |       5 |
+----+-----------+---------+
1 row in set (0.00 sec)


delimiter //
create procedure test.newid (IN mytablename VARCHAR(255) , OUT param1 INT)
begin
DECLARE  param2 INT;
select tablepk from newid where tablename = mytablename into param2 for update;
set param1 = param2 + 1;
update newid set tablepk = param1 where tablename = mytablename;
select param1;
commit;
end;//
delimiter ;



call newid('c',@a);
Query OK, 1 row affected (0.01 sec)
mysql> select @a;
+------+
| @a   |
+------+
| 6    |
+------+
1 row in set (0.00 sec)

mysql> select * from newid;
+----+-----------+---------+
| pk | tablename | tablepk |
+----+-----------+---------+
|  3 | c         |       6 |
+----+-----------+---------+
1 row in set (0.00 sec)

[ 本帖最后由 leera 于 2006-3-10 13:10 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP