s_help 2013-11-01 16:04
浏览 486
已采纳

数据库在数据导入时的并发问题(使用myBatis)

我有一个批量导入数据到数据库中的程序,代码主要做2件事情.

1.首先检查数据库中有无重复记录.如果有则返回false,不进行导入操纵.

2.没有重复数据,则导入这批数据.

现在我有这样一个疑问,当我做完检查的时候,系统发现没有重复,于是执行下面的导入操作.

可当我还没提交这批数据时,另一个系统修改了数据库,导致出现重复记录,也就是说出现了数据不一致的问题.

明明在检查的时候没有重复,可在提交的时候出现重复.象这种问题应该怎么解决,或者此类问题的解决思路是怎样的?

是在检查数据有无重复时就锁住整张表?如果要锁表,myBatis里应该怎么做呢?

  • 写回答

4条回答

  • mingxuxu 2013-11-04 12:40
    关注
    1. 行锁只能针对已经存在的记录,对于insert数据来说,行锁是无效的;
    2. 表锁是可以的,但是操作太重了,效率会很低;

    建议使用如下两种方式之一:

    1. 如果记录本身有主键类的标识的话,将这个字段的唯一性设置为True,这样两线程的insert相同记录就会有一个导致失败,Catch这个Exception就可以了,这个方法比较简单;

    2. 使用分布式锁,如果题主对Zookpeeper有了解的话可以通过Zookeeper设置加一个分布式锁(比如使用insert的主键标识拼接成为一个path,在insert之前获取锁,insert之后释放锁)

    前提是需要有能够设别两条记录是同一条记录的手段。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决