从文档中,finagle 给出了这个例子:
import com.twitter.finagle.mysql.{Client, Transactions}
import com.twitter.util.{Future, Throw}
case class ReallyBadException() extends Exception
val client: Client with Transactions = ???
client.session { session =>
val result = for {
_ <- session.query("LOCK")
r <- session.transaction { tx =>
tx.query("...")
}
_ <- session.query("UNLOCK")
} yield r
result.rescue {
case e: ReallyBadException =>
session.discard().flatMap(_ =>
Future.exception(e)
)
}
}
好的,所以当我为锁添加正确的 sql 时: SELECT GET_LOCK('foo',2) 这应该持有锁。对于这个测试,我有意删除了任何解锁——我希望它在第二次尝试获得锁时失败。
但是……对该代码的两次后续调用都有效——没有锁定失败,即使我引入延迟 >2 秒,旨在导致第二次锁定尝试超时。
为什么锁定行为似乎没有做任何事情?