【问题标题】:Data not updated in oracle-db within the running funtion运行函数中的 oracle-db 中的数据未更新
【发布时间】:2020-08-21 08:19:46
【问题描述】:

从方法 callAndUpdateInB(),假设我正在调用 B(@Component) 类的 update() 方法,其中我正在调用 myRepository.save() 方法来更新 db 中的一些数据,并且在相同的功能中我正在执行其他一些调用...然后将响应返回给 A 类。

所以问题是当 B 类方法 update() 将响应返回给 A 类方法 callAndUpdateInB() 时,数据在 db 中得到更新。 但是当我在 B() 类的更新方法中调用 myRepository.save() 时,它应该已经更新了。

为什么会这样?

仅供参考,请查看这个虚拟示例

class A{

    @Autowired
    B b;

    public void callAndUpdateInB(String arg){

        String data = b.update(arg);

        //    check Updates in Db (True)
        //    Now data is updated in db
    }
}  

@Component
class B{

    @Transactional(
    propagation = Propagation.REQUIRED
    )
    public String update(String arg){
        MyRepository myRepository; //  This is abstract class having 
                                   //  imlementation for the following 
                                   //  data. (MyRepositoryImpl)
        String updatedData = myRepository.save(arg);

        //    check Updates in Db (False)
        //    Making some other calls, which need that updated data
        //    But data is not still updated in db.
        //    Though here the updated data field is showing that the data is updated, but it 
        //    is not actually updated in the db.

        return updatedData;
    }
}  

【问题讨论】:

  • 事务边界在哪里?方法更新是@Transactional 吗?
  • 是的,很抱歉没有提到这一点。现已更新
  • 如果您使用@Transactional,事务将在您的方法完成后提交。如果您不想从更新方法中删除 @Transactionl 并确保您的 Repository-save 是事务性的。

标签: oracle spring-boot microservices


【解决方案1】:

如果方法更新成功完成,事务将提交到数据库。

因此在方法返回之前你看不到数据。

另外保存不执行插入/更新语句。这也会发生在事务提交之前。

如果你想在调用 saveAndFlush() 之前执行语句。但是也不会提交事务,并且从另一个事务中您也不会看到此数据。

这是使用事务的 Spring 应用程序中通常和预期的事务行为。

【讨论】:

    【解决方案2】:

    Propagation REQUIRED

    • 支持当前事务,如果不存在则创建一个新事务。类似于 EJB 事务的同名属性。

    并在带注释的方法结束时保持事务未提交和活动。

    如果您在请求处理的一开始就调用update() 两次,第一次启动事务,第二次重用它。如果你调用你的update() 两次,一次成功,另一次不成功(在独特的约束或其他方面),这两个更改都将被回滚。

    开发人员通常希望事务以这样的方式开始和结束。但在某些情况下,需要独立于其他更改提交/回滚更改。如果是你的情况,你可以使用Propagation.REQUIRES_NEW:见 https://stackoverflow.com/a/24341843/12656244

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多