出现问题的背景:
γ项目中在风险部分会有系统消息和邮件通知用户,这里涉及到事务,具体的流程为update数据之后,又要利用多线程根据assetsId获取当前资产的风险等级,并将相应的消息和邮件发送给用户。
产生原因:
外层大方法使用事务,在方法中又新起多线程进行消息和邮件等操作,这里多线程不在包括在事务之中,所以读取到的数据是update操作之前的数据。事务中开启多线程,新的线程的事务不受外面大事务的影响,新开的事务。
外层的方法所有的代码执行后(所有线程结束前),数据库的操作均会在一个事务中提交。但是多线程自己的操作会提交自己的事务,想要读取update之后的数据,由于外层的事务还未提交,所以读取了之前的旧数据,也从侧面说明了事务的正确性,事务未结束,数据未更新。
解决方案:
1.在多线程中进行休眠等待,等待几秒钟再进行数据的读取,这样大概率很读取update之后的数据,但是这并不是一定ok的,可能在sleep之后并没有完成update操作,此时读到的还是旧数据。
2.将多线程的操作放置到大事务之后再进行操作。多线程操作有需要大事务中的参数可以在大事务执行完成后返回,然后进行使用。