mysql 数据库并发

yzw杨 发布于 2013/05/13 14:11
阅读 1K+
收藏 0

上传数据到数据库的时候,我是先通过查询出第一个表的最大值的自增id,在for语句循环累加,累加的数字为第二个表的某个字段,然后在进行mysql语句操作。但我想问下,如果出现同时几个人在操作数据的时候,这个最大值id累加会出现一些错误,我该怎样去防止多人同时添加数据呢?

如何考虑好数据库并发问题?有没有什么例子可以参照下?

加载中
0
优雅先生
优雅先生

参考:http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-optimization-tips.html

If you often need to calculate results such as counts based on information from a lot of rows, it may be preferable to introduce a new table and update the counter in real time. An update of the following form is very fast:

UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;

This is very important when you use MySQL storage engines such as MyISAM that has only table-level locking (multiple readers with single writers). This also gives better performance with most database systems, because the row locking manager in this case has less to do.

yzw杨
yzw杨
回复 @jxqlovedn : 数据库的东西不是很懂
优雅先生
优雅先生
回复 @yzw杨 : ....
yzw杨
yzw杨
有点复杂,看起来有点吃力
0
斯诺登
斯诺登

你的意思是上传数据到A表,同时生成关联的B表数据?

有几个方案:

1、A插一条,获取lastinsertid,然后B插一条

2、A批量插入,获取第一条和最后一条ID,然后顺序插入B

yzw杨
yzw杨
恩,第一种的话,可能时间会执行比较久点吧
0
赵晓勇
赵晓勇

我理解你的意思是,你把那个自增ID取出来,然后用程序累加,然后 往数据库插入数据。

假如是我上面所说的情况: 数据库有自增写法比如 mysql,设置为自增id以后,插入数据的时候把这个字段写 null 就回 mysql就自动把这个按+1处理。


举个例子,有 id,name  这么2张字段的一张表。id为自增。

在插入数据的时候 insert table(id,name) values (null,'zch');

假如这时候是 插入数据库的第一条数据, id就为1,

这个自增值有一个地方保存着,具体请自己百度了解。

yzw杨
yzw杨
恩,好的
0
0
skyline520
skyline520
可以加锁 
1、对数据库加锁
2、提供一个单例类获取最大id ,程序中对这个单例获取最大id的方法加锁
0
优雅先生
优雅先生
像上面那样另外建一张表保存最大的自增ID,然后对这张计数表还是加行级锁,比单纯对数据表加行级锁的开销可能要小很多。
0
灰花走湿
灰花走湿
做一个触发器,锁定数据表操作
0
八宝旗
八宝旗

楼主的需求不是很明确,大家都在猜你的需求,最好提供具体的例子

元数据、期望结果,当前的结果

0
魔力猫
魔力猫
请说明你为什么要这么干。主键一边情况下不要和具体业务混在一起。
yzw杨
yzw杨
防止mysql超时,因为我是在网页上上传数据的
0
muyeyifan
muyeyifan
按道理不管是mysiam还是innodb,增改的时候,mysql对前者是表锁,后者一般是行锁,现在楼主也没说到底是什么引擎,还有需求也是让人看得稀里糊涂
yzw杨
yzw杨
行锁的话,大概怎么操作的?
返回顶部
顶部