使用事务的一个注意点

最近在代码中配置了一个事务,事务的意思就是当前这件事情要么全部正常做完,要么全部不做。为了避免数据库中出现脏数据,我给XXX类的ff方法配置了事务。在ff方法主要做下面这几件事情

  • 1.从数据库中读出一批数据dataList1,此时dataList1已经存在于内存中了。
  • 2.修改这一批数据,此时的修改不会写到数据库,因为事务暂时还没有提交。
  • 3.根据dataList1中的数据进行判断,然后再写数据库。

这么处理有问题,因为dataList1在2结束后,会发生变化,但是内存中的dataList1感知不到,也就是说3处用的dataList1还是老数据,不是2修改后的数据,因此3处的判断条件会出现问题,因为3处用到的dataList1不是事务中最新的数据。

修复后的步骤如下:

  • 1.从数据库中读出一批数据dataList1,此时dataList1已经存在于内存中了。
  • 2.修改这一批数据,此时的修改不会写到数据库,因为事务暂时还没有提交。
  • 3.从数据库中再读取一次dataList1。
  • 4.根据dataList1中的数据进行判断,然后再写数据库。

注意:
事务中对数据库进行读写操作,此时写入的数据不会写到数据库中,但是能从事务中读取到最新的数据,如果要基于某些数据做判断,最好保证判断时这些数据在事务中是最新的,不要沿用一开始就加载到内存中的那批数据,因为一开始的数据不是最新的。

在事务中切忌发消息给其他系统,因为这个逻辑不对,事务可能会回滚,因为数据出错啥的,但是发出去的消息没法回滚,因此一旦在事务中发消息就会破坏事务的一致性。自己在事务中发了一个消息给外部系统,事务还没有提交,外部系统收到消息后找我来查询刚才事务中产生的数据,查询DB当然就查询不到了,因为事务还没有提交,消息就已经出去了,以后在事务中切忌发消息给外部系统。