您的位置:首页 > 博客中心 > 数据库 >

Mysql事务结合spring管理

时间:2022-03-15 10:46

spring事务相关问题记录

遇到情况:

在本地单体应用调试代码时,发现在一个加了@transaction注解的方法里进行先更新后查询的操作,查询的结果是可以看到更新的内容的。而在微服务环境中同样的代码却在后查询时查不到前面更新的内容。

伪代码如下:

@Transactional
    public void call() {
        bidPlanMapper.updateByPrimaryKey(plan);
        List<BidPlan> all = systemService.findBidPlan();
        System.out.println(all);//单体应用时可观察到更改的结果
    }

猜测本地可以而微服务上不可以,估计是因为微服务在执行call()方法时,update操作是由biz服务调用的,而findBidPlan()操作是实际是调用system服务进行的(该方法也有@Transactional),故产生的是两个事务。

处理办法:
  • update操作后立刻提交事务,则另外一个事务可以查询到处理的结果。
@Autowired
private DataSourceTransactionManager transactionManager;

public void call() {
    //开启新事务
    DefaultTransactionDefinition transDefinition = new DefaultTransactionDefinition();
    transDefinition.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW);
    TransactionStatus transStatus = transactionManager.getTransaction(transDefinition);
    try {
        bidPlanMapper.updateByPrimaryKey(plan);//先提交更新的操作
        transactionManager.commit(transStatus);
    } catch (Exception e) {
        transactionManager.rollback(transStatus);
    }
}

扩展阅读:

隔离级别:

隔离级别定义一个事务可能受其他并发事务活动活动影响的程度。另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度。

在一个典型的应用程序中,多个事务同时运行,经常会为了完成他们的工作而操作同一个数据。并发虽然是必需的,但是会导致以下问题

  • 脏读(Dirty read)-- 脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据时。如果这些改变在稍后被回滚了,那么第一个事务读取的数据就会是无效的。

  • 不可重复读(Nonrepeatable read)-- 不可重复读发生在一个事务执行相同的查询两次或两次以上,但每次查询结果都不相同时。这通常是由于另一个并发事务在两次查询之间更新了数据。(即不可重复读到同值)

  • 幻影读(Phantom reads)-- 幻影读和不可重复读相似。当一个事务(T1)读取几行记录后,另一个并发事务(T2)插入了一些记录时,幻影读就发生了。在后来的查询中,第一个事务(T1)就会发现一些原来没有的额外记录。

隔离级别

本类排行

今日推荐

热门手游