实际项目开发中遇到这样的一个问题,主表的读取和副表的读取,前者为表更新以前的结果,后者为表更新以后的结果。由此怀疑mysql事务提交以后表更新不是按照表的语句先后顺序执行,而是按照mysql的自身的优化机制(并没有实证)来决定语句前后的,可是事务未执行完毕以前对外部是不可见,要不就回出现脏读,因此上述即便成立,也不会形成该问题。mysql
事情的原因是这样:外部应用在提交业务数据的变动以前,会先调用api读取上述的两个表,进行必定的运算,而后调用另外一个api写入主副表信息。因为并发处理很差,致使有几回的读写。按照业务逻辑主表和副表是一次事务操做写入,另外主表在前,副表在后。因为并发的缘由,致使出现了一个奇怪的现象,在第二次的并发读写中,外部应用获得了这样的结果:主表为更新前的结果,副表为更新以后的结果,由此怀疑事务的表操做顺序,貌似事务先执行了副表,后执行了主表。sql
后续的分析肯定了最终的缘由以下:api
外部api读写主副进行计算,在读取的时候上一次写操做还未完成,因此主表读取的数据为旧数据,以后写操做完成了以后,外部api读取至副表信息,因此读取到新的副表信息。其实外部api读取主副表只是一次(接口内部实现为先读取主信息,再读取副表),因此形成该异常。缓存
总结:①事务依次执行的重要,最好锁机制(缓存或文本锁......)②作好数据写入的校验......并发