In order to share the running transaction into a DAO style data management class, I have wrapped the transaction in an Arc<Mutex> and pass it into the DAO.

The issue is, once the transaction is in there I cannot call commit() on it because it cannot be moved out of the Arc<Mutex> anymore, as the commit requires a mut self.

Any ideas on how to work around this?

  • SorteKanin@feddit.dk
    link
    fedilink
    arrow-up
    1
    ·
    17 days ago

    This screams of XY problem. You’ve gotten a new problem from using this method and you’re asking for help for that, but probably there is an underlying better solution that solves your actual use case without running into this problem at all.

    • Cpo@lemm.eeOP
      link
      fedilink
      arrow-up
      0
      arrow-down
      2
      ·
      17 days ago

      So your answer is “you are doing it wrong”.

      Thank you, very helpful 😉

      • SorteKanin@feddit.dk
        link
        fedilink
        arrow-up
        1
        ·
        17 days ago

        That’s not what I said. Read about the XY problem and then come back and explain what you actually want to achieve, and give some more information like code examples.

  • nous@programming.dev
    link
    fedilink
    English
    arrow-up
    0
    ·
    17 days ago

    Transactions should be short lived, they block data on the database side from acessing those tables or rows. Best to not jole onto a transaction that long and instead gather your data first or rethink your access patterns to your data base.

    But arc does give you a try_unwrap which returns the inner type if there is only one strong copy left. And mutex gives you an into_inner to move out of it. But really transactions should not be held for a long period of time.

    • Cpo@lemm.eeOP
      link
      fedilink
      arrow-up
      0
      ·
      17 days ago

      Seems like the into_inner is the way (i see other references to it).

      And yes, transactions should be short-lived, this is just about delegating it to the responsible component.

      • nous@programming.dev
        link
        fedilink
        English
        arrow-up
        0
        ·
        17 days ago

        Not sure why you need an arc mutex to delegate it to the responsible component. Seems like the type of thing that should not cross thread boundaries nor be cloned multiple times.

          • BB_C@programming.dev
            link
            fedilink
            arrow-up
            1
            ·
            16 days ago

            You appear to be generally confused.

            If you’re using the multi-threaded work-stealing tokio runtime (the default), you are “talking threads”. And if you aren’t, Arc and Mutex would be useless, irregardless of whether you’re doing it right or wrong.