session cloud spanner 库的池是否用于Java FIFO?
Is session pool of the cloud spanner library for Java FIFO?
如果不是FIFO,会导致意外中止
Spanner 的中止系统和写入规范 session 如下;
- 如果事务发生冲突,spanner 将中止其中一个。
- 中止哪个事务基本上由事务的开始时间决定。
- 写入操作的会话启动事务,然后将它们保留在池中。
如果session池不是FIFO,一个线程(=A)启动的事务有可能会被另一个线程(=B)启动的另一个事务中止,即使B占用A取session后的session.
在 Java 客户端库中,会话池中的会话在 LIFO order 中返回,以改进服务器端的缓存和性能。
在 SessionPool 中使用 FIFO 与 LIFO 应该不会对事务中止率产生任何影响。对于冲突事务,开始时间计为调用 BeginTransaction 后对事务的第一个操作。所以它不应该依赖于使用哪个会话。
此外,截至 v3.0.0, session pool preparing for read/write transactions has been removed, so now the transaction starts when a session is retrieved from the pool when the transaction is run. See details here。
如果不是FIFO,会导致意外中止
Spanner 的中止系统和写入规范 session 如下;
- 如果事务发生冲突,spanner 将中止其中一个。
- 中止哪个事务基本上由事务的开始时间决定。
- 写入操作的会话启动事务,然后将它们保留在池中。
如果session池不是FIFO,一个线程(=A)启动的事务有可能会被另一个线程(=B)启动的另一个事务中止,即使B占用A取session后的session.
在 Java 客户端库中,会话池中的会话在 LIFO order 中返回,以改进服务器端的缓存和性能。
在 SessionPool 中使用 FIFO 与 LIFO 应该不会对事务中止率产生任何影响。对于冲突事务,开始时间计为调用 BeginTransaction 后对事务的第一个操作。所以它不应该依赖于使用哪个会话。
此外,截至 v3.0.0, session pool preparing for read/write transactions has been removed, so now the transaction starts when a session is retrieved from the pool when the transaction is run. See details here。