xml地图|网站地图|网站标签 [设为首页] [加入收藏]

【奥门金沙手机娱乐网址】并发环境下mysql插入检查方案

时间:2020-04-07 23:02来源:计算机
政工背景: 基本业务场景是这么的,诉求数据步入到接口中,须求先决断其在数据库中的状态,倘使库中不设有该vin,或许该vin状态位为“1”,则进行一些检查操作后,将数据插入到

政工背景: 基本业务场景是这么的,诉求数据步入到接口中,须求先决断其在数据库中的状态,倘使库中不设有该vin,或许该vin状态位为“1”,则进行一些检查操作后,将数据插入到数据库中,那时大幅度扩充vin状态为0,调用人工管理接口,十一分钟后回去结果,将景况置为1。假若其场地位为“0”则拒却操作,重回提醒音讯。 在单线程情形下,那样的作业并没相当,但是当现身访谈接口时,会冒出同有时间跻身两条vin相同的呼吁AB,寻常情形相应插入一条A,驳倒一条B。然则并发景况下,B实行检查情形时A还并没有加塞儿,因而AB都步向到了数据库中,数据就漏洞相当多了。

抽薪止沸方案一: 首先想到的是运用sql管理,对数据库对应字段加独一索引,保险一致性。即便插入重复的多寡,则catch该特别,做出提示。

ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))

但是由于事情范围,vin在库中是足以重新的,多条重复数据查询最新,所以不能够再vin上加多独一索引。

养虎遗患方案二: 使用mysql事务操作,将检查是或不是存在和插入作为三个事务进行处理,当检查退步的时候,不实行扦插。从英特网搜索了一晃,大致思路如下:

public static void StartTransaction(Connection con, String[] sqls) throws Exception { try { // 事务开始 con.setAutoCommit(false); // 设置连接不自动提交,即用该连接进行的操作都不更新到数据库 sm = con.createStatement(); // 创建Statement对象 //依次执行传入的SQL语句 for (int i = 0; i  sqls.length; i++) { sm.execute(sqls[i]);// 执行添加事物的语句 } con.commit(); // 提交给数据库处理 // 事务结束 //捕获执行SQL语句组中的异常 } catch (SQLException e) { try { System.out.println("事务执行失败,进行回滚!n"); con.rollback(); // 若前面某条语句出现异常时,进行回滚,取消前面执行的所有操作 } catch (SQLException e1) { e1.printStackTrace(); } } finally { sm.close(); } }

而是这么实在仍然不曾消逝现身的难点,这样只是把七个操作形成了叁个原子的sql操作,能够用于同期插入两条数据一致性的情事,但并不适合供给。

既然sql层面并未有减轻难点,就考虑从java的现身编程方向消除。 寸草不留方案三: java消逝现身难题,首先想到的是应用内置锁也许可重入锁,基本语法如下: ·内置锁: 由于是在Servlet中张开的拍卖,因而使用synchronized(this卡塔尔国直接处管事人情代码,使得并发意况下,只好有多少个线程访谈到该段业务代码:

synchronized(this){ //todo1:检查vin是否存在 //todo2:如果不存在插入vin}

·可重入锁: 约等于越来越灵敏的嵌入锁,在那与内置锁基本近似

public class DashengCallBack extends HttpServlet { private static ReentrantLock lock= new ReentrantLock(); protected void doGet(HttpServletRequest request, HttpServletResponse response){ lock.lock(); try{ //todo1:检查vin是否存在 //todo2:如果不存在插入vin }finally{ lock.unlock(); } }}

经过测量试验,那几个方案是有效的,最后未有选拔的案由是因为平昔利用这种方法加锁,加锁的代码太多,影响效能。

减轻方案四: 设置二个查询Map,插入前存储数据,插入后删除数据,代码如下:

 ConcurrentHashMapString, String vinMap=new ConcurrentHashMapString,String(); if(vinMap.containsKey(vin)){ // todo1: vin 请求完毕后, 从vinInRequestMap里删掉这个vinNo // todo2: 返回正在查询 } vinMap.put(vin, ""); //todo3:插入vin到数据库 vinMap.remove(vin); }

以此方案基本满意了业务须求,独一的难点是需求接口的更新时间要与作业时间错开,不然更新接口会清空vinMap,引致库中多少错乱,现身谬误。

上述就是本文的全部内容,希望对大家的学习抱有助于。

编辑:计算机 本文来源:【奥门金沙手机娱乐网址】并发环境下mysql插入检查方案

关键词: