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"
)