利用事务一次提交大量插入操作会撑爆数据库服务器内存吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用事务一次提交大量插入操作会撑爆数据库服务器内存吗?相关的知识,希望对你有一定的参考价值。

比如一个事务中进行20-50万次插入操作会不会出问题啊?
请不要想当然的回答,最好是有经验或做过类似测试的人来回答一下、
如果会的话,
请问事务提交数量和内存消耗的关系大致是怎么样的?
如果分批提交的话,不是没法回滚了吗?因为数据是一次进来的啊……

不知道是什么数据库,oracle的话建议:
只需设置足够大的undo表空间,所谓足够大:insert操作要大于数据大小的一倍;update,delete操作要大于数据大小的两倍。当然你要兼顾其他操作的消耗。

提交数量可以认为与内存消耗没什么关系。

如你所述,如果分批的话,会涉及的整个事物的完整性,这和业务逻辑相关,
使用oracle的话,既然这需要是一个事务来提交,既没必要在分批。而且也不建议去故意分批进行操作。

不分批你唯一要承担的就是分批足够的undo空间。
参考技术A 一般都是用statement的executeBatch方法实现批量数据入库操作。
还有一种SQL方式:insert into test(id,name) values('1','Jerry'),('2','Tom'),.....('n','Neo');这样看来,只要拼接好一条SQL,通过statement的execute方法就能实现批量插入操作。
但是一般平台开发都不会用这种方式。
参考技术B 爆机的机率相当的高,我们做的时候一般大概是2万条左右提交一次,也就是分批提交。 参考技术C 分配足够的undo表空间吧

MySQL修改配置优化插入性能

1.将innodb_flush_log_at_trx_commit配置为0。插入速度会有很大提高。

0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
优缺点:该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。

1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。
优缺点:该模式是最安全的,但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。

2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
优缺点:该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。

2.将innodb_autoextend_increment配置由默认8M调整为128M。该项为数据库的表空间耗尽时自动扩展的大小。

3.将Innodb_log_buffer_size配置由默认1M调整到16M。增大日志缓存,减少写数据文件次数。

4.将innodb_log_file_size配置由默认8M调整128M。设定undo日志大小,减少数据库checkpoint操作。

5.将max_allowed_packet配置由默认4M调整为16M。该项为服务器发送和接受的最大包长度,如果一次过插入的数据量大于该值会被拒绝,报错信息为“Packet for query is too large”。

 

以上是关于利用事务一次提交大量插入操作会撑爆数据库服务器内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

几百万数据放入内存不会把系统撑爆吗?

oracle的提交

基于内存的类似redis的缓存方法

Java进阶:mysql的事务隔离级别面试题

python_文件操作

mysql repeatable-read 一次利用间隙锁解决幻读案例