采用多线程对数据库读写引发冲突 20
数据库里存了几百台系统信息,要定时从数据库查询系统列表,连接到每台系统,采集一些数据,然后把采集到的数据再存到数据库中,便于日后查询。因为系统数量庞大,所以采用的是多线程...
数据库里存了几百台系统信息,要定时从数据库查询系统列表,连接到每台系统,采集一些数据,然后把采集到的数据再存到数据库中,便于日后查询。
因为系统数量庞大,所以采用的是多线程操作,这样可以提高采集数据的速度。但问题就在于收集到数据以后插入数据库时发生冲突,因为常常多个进程都想要把自己的数据插入,而且是插入同一个表,但只有一个进程能真正取得写入权(个人猜测是因为insert的时候数据库自动把表给lock了?),因此导致其他进程的数据没法写入而丢失。
有没有办法解决这一问题? 展开
因为系统数量庞大,所以采用的是多线程操作,这样可以提高采集数据的速度。但问题就在于收集到数据以后插入数据库时发生冲突,因为常常多个进程都想要把自己的数据插入,而且是插入同一个表,但只有一个进程能真正取得写入权(个人猜测是因为insert的时候数据库自动把表给lock了?),因此导致其他进程的数据没法写入而丢失。
有没有办法解决这一问题? 展开
3个回答
展开全部
我只说oracle的吧,insert的时候一般是会加行级写锁,一般不会升级到表级锁,多个线程之间处理的数据是否存在抢占了呢?如果是单纯的insert into 不同的信息是不会冲突的
追问
你好,能不能解释下“抢占”?比如,抢占的是什么?为什么会抢占?
其实我不是100%肯定是不是insert的原因,现在的情况是,数据库里有200台系统,但最后查询后插入的只有120条信息,其他80台的信息丢失了。而我可以100%确定信息获取无误 (命令程序输出sql insert语句,语句正确),就是在之后执行sql_command(sql)时出现了问题。
追答
比如说线程1执行 select * from t where a='1' for update; 线程2恰好也在执行select * from t where a='1' for update; 这时就会出现抢占,线程2就会等待
你每个线程是取模处理数据了吗?还是每个线程都要插入200条记录?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-08
展开全部
使用事务,能解决一定程度的问题
~~~~
~~~~
追问
你好,对数据库不太了解,事务是什么?能更具体一点吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询