多线程事务(Excel批量导入)

场景如下:

导入10w条Excel数据到数据库中。需要保证原子性。

一、普通的方式:

一条线程开启事务,导入所有的数据后提交数据。

可能出现的问题:

插入时间过长,导致事务过大造成数据库连接池连接长时间被占用。

二、多线程方式:

例如开启10个线程,每个线程导入10000条数据,然后提交。

可能出现的问题:

无法保证事务:无法保证事务原子性。如果一条线程导入失败回滚了,最后只能导入90000条数据。

改进方式:

10个线程在内存中维护一个变量,变量标记了所有线程导入数据的状态(已回滚,插入完成待提交)。每个线程插入数据完成后修改变量状态为当前线程等待提交,循环变量所有的状态直到所有线程都是等待提交的状态后执行提交。

可能出现的情况: 某一个线程一直没有插入完成导致其他线程一直在等待这个线程进入待提交状态。所以需要设置一个超时时间,如果超时,线程设置共享变量为当前线程已回滚,此时其他线程也回滚。 注意:访问共享变量需要用锁控制同步(防止出现一个线程超时,修改共享变量从待提交至已回滚的同时最后一个线程完成插入数据操作,导致数据未能全部回滚)。

多线程导入的方式还是会有问题: 线程都进入等待提交后执行提交,某一个线程提交失败回滚,但是其他线程数据提交了。

上述情况没有比较好的方式去控制,只能借鉴分布式事务的解决方式才能比较好的控制多线程事务。

经验分享 程序员 微信小程序 职场和发展