多做一次查询也是能查到该数据。数据库引擎使用的是InnoDB,手动删除之后,也commit了。猜测是因为缓存。但是同事全java开发,也是使用的InnoDB,没有出现这样的情况

解决方案 »

  1.   

    你的程序的insert和select如果是在一个事务中而且设置的事务级别是可重复读就是正常的
      

  2.   

    业务处理是这样的。先再程序中调用MySQL接口,插入一条数据,然后通过业务处理,再commit。我在shell中
    执行mysql -p -u -h -D连接到数据库中,执行删除操作,删除这条数据。再在程序中插入一条相同的数据。结果
    提示数据已存在,拒绝再次插入该数据。虽然走的是同一段代码,但是是分两次进入,属于不同的事务。应该是
    异常情况。
      

  3.   

    业务处理是这样的。先再程序中调用MySQL接口,插入一条数据,然后通过业务处理,再commit。我在shell中
    执行mysql -p -u -h -D连接到数据库中,执行删除操作,删除这条数据。再在程序中插入一条相同的数据。结果
    提示数据已存在,拒绝再次插入该数据。虽然走的是同一段代码,但是是分两次进入,属于不同的事务。应该是
    异常情况。你第一次程序调用的时候插入语句后有启事务么?事务有没有提交?
      

  4.   

    注意到了这样一点:多做一次查询也是能查到该数据。数据库引擎使用的是InnoDB,手动删除之后,也commit了。猜测是因为缓存。但是同事全java开发,也是使用的InnoDB,没有出现这样的情况某些java的provider是存在本地cache的,例如 eclipselink、hibernate。通常这些应用在EntityManager中会缓存对象数据。如果你仅仅是修改或是删除操作,应用层面的缓存是没有变化的,因此还能查到。当然了,这是一种提高访问效率的做法。两种处理方法,在应用层程序中关闭缓存或者通过应用层删除数据。当然了,重启应用,肯定也没有问题。