- 论坛徽章:
- 0
|
^_^,我一定会做个测试方案
在这之前我,我决定用这个存储过程来确保不会出错
我的解决方案是这样的 , 为我的数据库创建一个控制表,记录所有的表名,然后搞一个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 编辑 ] |
|