0

I am trying to run transaction in mongodb 4.2.6. The problem I am facing is when I try to create bulk insert (insertMany) transaction does not happen, But in the case on non-bulk-insert (insertOne) transaction happens without any problem.

I am doing this with reactivemongo driver 0.18.4-play27 with playframework.

The error is ::::

MultiBulkWriteResult(false,0,0,List(),List(),None,None,Some(CommandError[code=251, errmsg=Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1, doc: {
  "errorLabels": [
    "TransientTransactionError"
  ],
  "operationTime": Timestamp(1589884677, 1),
  "ok": 0.0,
  "errmsg": "Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1",
  "code": 251,
  "codeName": "NoSuchTransaction",
  "$clusterTime": {
    "clusterTime": Timestamp(1589884677, 1),
    "signature": {
      "hash": BSONBinary(GenericBinarySubtype, size = 20),
      "keyId": NumberLong(6824032301186285572)
    }
  }
}]),0)

my code is

lazy val reactiveMongoApi = inject[ReactiveMongoApi]

 reactiveMongoApi.database.flatMap {
      db: DefaultDB =>
        val startSession = db.startSession()

        startSession.flatMap {

          case Some(sessionDb) =>

            val startTnx = sessionDb.startTransaction(Option(WriteConcern.Default))


            startTnx match {
              case None => Future(println("Database replica is not initiated"))
              case Some(dbWithTnx: DefaultDB) =>

                val collFoo = dbWithTnx.collection[BSONCollection]("foo")

               val writeResultFuture: Future[MultiBulkWriteResult] = for{
                  r <- collFoo.insert(false).many(Seq(BSONDocument("name" -> "Jack"),BSONDocument("name" -> "Ma")))
                } yield r


                writeResultFuture.map{
                  wr =>
                    println(wr)
                    dbWithTnx.commitTransaction().flatMap{
                      _ =>
                        sessionDb.endSession()
                    }
                }


            }


          case None => Future(println("None"))

        }


    }

A test code:

package db

import org.scalatest.{AsyncFlatSpec, Matchers}
import play.modules.reactivemongo.ReactiveMongoApi
import reactivemongo.api.collections.bson.BSONCollection
import reactivemongo.api.commands.MultiBulkWriteResult
import reactivemongo.api.{DefaultDB, WriteConcern}
import reactivemongo.bson.BSONDocument

import scala.concurrent.Future


class TransactionTest extends AsyncFlatSpec with Matchers with Inject {

  lazy val reactiveMongoApi = inject[ReactiveMongoApi]




  def test2() = {


    reactiveMongoApi.database.flatMap {
      db: DefaultDB =>
        val startSession = db.startSession()

        startSession.flatMap {

          case Some(sessionDb) =>

            val startTnx = sessionDb.startTransaction(None)


            startTnx match {
              case None => Future(println("Database replica is not initiated"))
              case Some(dbWithTnx: DefaultDB) =>

                val collFoo = dbWithTnx.collection[BSONCollection]("foo")
                val collBar = dbWithTnx.collection[BSONCollection]("bar")

                import reactivemongo.play.json._
                val writeResultFuture = for {
                  r <- collFoo.insert(false).many(Seq(BSONDocument("name" -> "anna")))
                  _ <- collBar.insert(false).one(BSONDocument("HI" -> "Hello"))
                } yield r


                writeResultFuture.map {
                  wr =>
                    println(wr)
                    dbWithTnx.commitTransaction().flatMap {
                      _ =>
                        sessionDb.endSession()
                    }
                }


            }


          case None => Future(println("None"))

        }


    }

  }


  it should "create transaction" in {
    test2().map(_ => succeed)
  }


}

Error log:

Reporter completed abruptly with an exception after receiving event: TestFailed(Ordinal(0, 3),CommandError[code=251, errmsg=Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1, doc: {
  "errorLabels": [
    "TransientTransactionError"
  ],
  "operationTime": Timestamp(1589961720, 1),
  "ok": 0.0,
  "errmsg": "Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1",
  "code": 251,
  "codeName": "NoSuchTransaction",
  "$clusterTime": {
    "clusterTime": Timestamp(1589961720, 1),
    "signature": {
      "hash": BSONBinary(GenericBinarySubtype, size = 20),
      "keyId": NumberLong(6824032301186285572)
    }
  }
}],TransactionTest,db.TransactionTest,Some(db.TransactionTest),should create transaction,should create transaction,Vector(),Some(reactivemongo.api.commands.CommandError$DefaultCommandError: CommandError[code=251, errmsg=Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1, doc: {
  "errorLabels": [
    "TransientTransactionError"
  ],
  "operationTime": Timestamp(1589961720, 1),
  "ok": 0.0,
  "errmsg": "Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1",
  "code": 251,
  "codeName": "NoSuchTransaction",
  "$clusterTime": {
    "clusterTime": Timestamp(1589961720, 1),
    "signature": {
      "hash": BSONBinary(GenericBinarySubtype, size = 20),
      "keyId": NumberLong(6824032301186285572)
    }
  }
}]),Some(3919),Some(IndentedText(- should create transaction,should create transaction,0)),Some(SeeStackDepthException),Some(db.TransactionTest),None,pool-1-thread-1-ScalaTest-running-TransactionTest,1589961728280).
java.io.NotSerializableException: reactivemongo.api.BSONSerializationPack$
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
        at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
        at org.scalatest.tools.SocketReporter.apply(SocketReporter.scala:31)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10(DispatchReporter.scala:249)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10$adapted(DispatchReporter.scala:248)
        at scala.collection.immutable.List.foreach(List.scala:312)
        at org.scalatest.DispatchReporter$Propagator.run(DispatchReporter.scala:248)
        at java.lang.Thread.run(Thread.java:748)
[info] - should create transaction *** FAILED ***
[info]   reactivemongo.api.commands.CommandError$DefaultCommandError: CommandError[code=251, errmsg=Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1, doc: {
[info]   "errorLabels": [
[info]     "TransientTransactionError"
[info]   ],
[info]   "operationTime": Timestamp(1589961720, 1),
[info]   "ok": 0.0,
[info]   "errmsg": "Given transaction number 1 does not match any in-progress transactions. The active transaction number is -1",
[info]   "code": 251,
[info]   "codeName": "NoSuchTransaction",
[info]   "$clusterTime": {
[info]     "clusterTime": Timestamp(1589961720, 1),
[info]     "signature": {
[info]       "hash": BSONBinary(GenericBinarySubtype, size = 20),
[info]       "keyId": NumberLong(6824032301186285572)
[info]     }
[info]   }
[info] }]
[info]   ...
Exception in thread "Thread-8" java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: reactivemongo.api.BSONSerializationPack$
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1577)
        at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1975)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
        at org.scalatest.tools.Framework$ScalaTestRunner$Skeleton$1$React.react(Framework.scala:822)
        at org.scalatest.tools.Framework$ScalaTestRunner$Skeleton$1.run(Framework.scala:811)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.NotSerializableException: reactivemongo.api.BSONSerializationPack$
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
        at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
        at org.scalatest.tools.SocketReporter.apply(SocketReporter.scala:31)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10(DispatchReporter.scala:249)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10$adapted(DispatchReporter.scala:248)
        at scala.collection.immutable.List.foreach(List.scala:312)
        at org.scalatest.DispatchReporter$Propagator.run(DispatchReporter.scala:248)
        ... 1 more
Reporter completed abruptly with an exception after receiving event: RunCompleted(Ordinal(0, 5),Some(4308),Some(Summary(0,1,0,0,0,1,0,0)),None,None,None,main,1589961728350).
java.net.SocketException: Broken pipe (Write failed)
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
        at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
        at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786)
        at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1286)
        at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1231)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1427)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1577)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:351)
        at org.scalatest.tools.SocketReporter.apply(SocketReporter.scala:31)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10(DispatchReporter.scala:249)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$10$adapted(DispatchReporter.scala:248)
        at scala.collection.immutable.List.foreach(List.scala:312)
        at org.scalatest.DispatchReporter$Propagator.run(DispatchReporter.scala:248)
        at java.lang.Thread.run(Thread.java:748)
Reporter completed abruptly with an exception on invocation of the dispose method.
java.net.SocketException: Broken pipe (Write failed)
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
        at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
        at java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1822)
        at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:719)
        at org.scalatest.tools.SocketReporter.dispose(SocketReporter.scala:37)
        at org.scalatest.Reporter$.propagateDispose(Reporter.scala:152)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$11(DispatchReporter.scala:260)
        at org.scalatest.DispatchReporter$Propagator.$anonfun$run$11$adapted(DispatchReporter.scala:259)
        at scala.collection.immutable.List.foreach(List.scala:312)
        at org.scalatest.DispatchReporter$Propagator.run(DispatchReporter.scala:259)
        at java.lang.Thread.run(Thread.java:748)

I am using play 2.7x

config:

mongodb.uri = "mongodb://play:playpass@127.0.0.1:27017/playApp?authenticationDatabase=admin&rm.nbChannelsPerNode=10&readPreference=secondaryPreferred"

dependency in build.sbt

libraryDependencies ++= Seq(
  "org.reactivemongo" %% "play2-reactivemongo" % "0.18.4-play27"
)
John
  • 2,633
  • 4
  • 19
  • 34

0 Answers0