Hello, Igniters! I've update IEP [1] and implement PoC according to new approach (multiple concurrent transactions per connection). But to move forward another feature need to be implemented: suspend/resume for pessimistic transactions (IGNITE-5714 [2]). Implementation of suspend/resume is ready now and ticket in 'Patch available' status. Can any transactions expert help with review of IGNITE-5714?
[1]: https://cwiki.apache.org/confluence/display/IGNITE/IEP-34+Thin+client%3A+transactions+support [2]: https://issues.apache.org/jira/browse/IGNITE-5714 чт, 4 апр. 2019 г. в 11:32, Alex Plehanov <plehanov.a...@gmail.com>: > Vladimir, > > Ok, then I will rewrite IEP in the near future. > > чт, 4 апр. 2019 г. в 11:14, Vladimir Ozerov <voze...@gridgain.com>: > >> Hi Alex, >> >> I think we should be able to handle many transactions through a single >> connection. This will make our protocol and client implementations much >> more efficient, and simplicity from developer's perspective is not our >> goal. Consider normal nodes. We have server nodes and client nodes. You >> may >> span whatever number of transactions you need, but all of them are >> coordinated through a single connection. The same should be applicable to >> thin clients. Protocol is already designed to handle this, as we pass >> unique operation ID in order to distinguish one operation from another. It >> is true, though, that we will have to introduce a kind of "session" >> concept, and pass additional identifier along with cache operations, but >> this doesn't sound like a problem to me. >> >> And provided that currently server-side transactions are bound to threads >> artificially, I would say that the first step in implementation of >> transactions on thin clients should be decoupling server-side transactions >> from threads. Without this we will have very inefficient implementation, >> when every new client transaction have to spawn a new thread. This is slow >> and introduces high memory pressure on a cluster node. We already work >> this >> way for MVCC transactions which are spawned from JDBC driver, and believe >> me, we do not want to replicated this bad practice to other clients :-) >> >> Vladimir. >> >> On Thu, Apr 4, 2019 at 10:08 AM Alex Plehanov <plehanov.a...@gmail.com> >> wrote: >> >> > Guys, so, do we need multiple concurrent transactions per connection? >> > >> > There are pros and cons for each approach. Difference between >> approaches: >> > >> > One transaction at a time per connection: >> > - This approach is used in RDBMS world and users got used to it >> > - To use transactions concurrently users need to use different >> connections >> > and get these connections via something like a connection pool >> > - Easy to implement (in fact, PoC is already done) >> > >> > Multiple concurrent transactions per connection: >> > - At least for java thin client, we can implement transaction per >> thread >> > approach as implemented now for the thick client (perhaps other thin >> > clients can implement the same abstraction) >> > - There is also protocol change for all cache operations needed (to >> bind >> > cache operation to the transaction) >> > - Significant changes to all implemented clients are needed >> > - Implementation on the server side is more complex >> > >> > What do you think? >> > >> > >> > вт, 2 апр. 2019 г. в 16:29, Alex Plehanov <plehanov.a...@gmail.com>: >> > >> > > Ilya, >> > > >> > > > We should be able to multiplex several transactions using a single >> > > Client connection. >> > > In this case, we should significantly change cache operations syntax >> (for >> > > each implemented client), to bind each operation to the transaction. >> > > >> > > > I want to also ask if "Number of entries participating in >> transaction >> > > (may be approximate). 0 - default value." is needed. >> > > I've tried to minimize API changes between thick and thin client to >> > > simplify move from one to another. It's the only reason. But I agree >> with >> > > you, the parameter is not very useful. >> > > >> > > >> > > вт, 2 апр. 2019 г. в 14:48, Ilya Kasnacheev < >> ilya.kasnach...@gmail.com>: >> > > >> > >> Hello! >> > >> >> > >> Pavel, I agree with you thorougly. We should be able to multiplex >> > several >> > >> transactions using a single Client connection. This means adding >> > >> Transaction id parameter to every affected cache operation / SQL >> > statement >> > >> (if applicable) to make sure we do cache operations on relevant >> > >> transaction. >> > >> >> > >> This is how other things work in Ignite, such as communication. We do >> > not >> > >> open dozens of connections, we multiplex operations asynchronously >> > through >> > >> a single connection. >> > >> >> > >> I think that trying to pool Ignite connections will be highly >> > >> inconvenient, >> > >> since there is no existing infrastructure for such pooling (like >> there >> > >> exists for JDBC). >> > >> >> > >> I want to also ask if "Number of entries participating in transaction >> > (may >> > >> be approximate). 0 - default value." is needed. Does it actually do >> > >> anything in our tx protocol? Users of existing APIs are already >> confused >> > >> by >> > >> this parameter, if we could get rid of it in thin client protocol it >> > would >> > >> be nice clean-up. >> > >> >> > >> Regards, >> > >> -- >> > >> Ilya Kasnacheev >> > >> >> > >> >> > >> вт, 2 апр. 2019 г. в 09:55, Pavel Tupitsyn <ptupit...@apache.org>: >> > >> >> > >> > Alex, >> > >> > >> > >> > > now we can only support one active transaction per connection >> > >> > >> > >> > I totally understand server-side and protocol limitations that are >> > >> causing >> > >> > this. >> > >> > But I have no idea how to support this in .NET Thin Client, for >> > example. >> > >> > >> > >> > It is thread-safe and can handle multiple async operations in >> > parallel. >> > >> > But with TX support we have to somehow switch to single-threaded >> mode >> > to >> > >> > avoid unexpected effects. >> > >> > >> > >> > Any ideas? >> > >> > >> > >> > >> > >> > On Mon, Apr 1, 2019 at 6:38 PM Alex Plehanov < >> plehanov.a...@gmail.com >> > > >> > >> > wrote: >> > >> > >> > >> > > Dmitriy, thank you! >> > >> > > >> > >> > > Guys, I've created the IEP [1] on wiki, please have a look. >> > >> > > >> > >> > > [1] >> > >> > > >> > >> > > >> > >> > >> > >> >> > >> https://cwiki.apache.org/confluence/display/IGNITE/IEP-34+Thin+client%3A+transactions+support >> > >> > > >> > >> > > >> > >> > > чт, 28 мар. 2019 г. в 14:33, Dmitriy Pavlov <dpav...@apache.org >> >: >> > >> > > >> > >> > > > Hi, >> > >> > > > >> > >> > > > I've added permissions to account plehanov.alex >> > >> > > > >> > >> > > > Recently Infra integrated Apache LDAP with confluence, so it is >> > >> > possible >> > >> > > to >> > >> > > > login using Apache credentials. Probably we can ask infra if >> extra >> > >> > > > permissions to edit pages should be added for committers. >> > >> > > > >> > >> > > > Sincerely, >> > >> > > > Dmitriy Pavlov >> > >> > > > >> > >> > > > ср, 27 мар. 2019 г. в 13:37, Alex Plehanov < >> > plehanov.a...@gmail.com >> > >> >: >> > >> > > > >> > >> > > > > Vladimir, >> > >> > > > > >> > >> > > > > About current tx: ok, then we don't need tx() method in the >> > >> interface >> > >> > > at >> > >> > > > > all (the same cached transaction info user can store by >> > himself). >> > >> > > > > >> > >> > > > > About decoupling transactions from threads on the server >> side: >> > for >> > >> > now, >> > >> > > > we >> > >> > > > > can start with thread-per-connection approach (we only can >> > support >> > >> > one >> > >> > > > > active transaction per connection, see below, so we need one >> > >> > additional >> > >> > > > > dedicated thread for each connection with active >> transaction), >> > and >> > >> > > later >> > >> > > > > change server-side internals to process client transactions >> in >> > any >> > >> > > server >> > >> > > > > thread (not dedicated to this connection). This change will >> not >> > >> > affect >> > >> > > > the >> > >> > > > > thin client protocol, it only affects the server side. >> > >> > > > > In any case, we can't support concurrent transactions per >> > >> connection >> > >> > on >> > >> > > > > the client side without fundamental changes to the current >> > >> protocol >> > >> > > > (cache >> > >> > > > > operation doesn't bound to transaction or thread and the >> server >> > >> > doesn't >> > >> > > > > know which thread on the client side do this cache >> operation). >> > In >> > >> my >> > >> > > > > opinion, if a user wants to use concurrent transactions, he >> must >> > >> use >> > >> > > > > different connections from a connection pool. >> > >> > > > > >> > >> > > > > About semantics of suspend/resume on the client-side: it's >> > >> absolutely >> > >> > > > > different than server-side semantics (we don't need to do >> > >> > > suspend/resume >> > >> > > > to >> > >> > > > > pass transaction between threads on the client-side), but >> can't >> > be >> > >> > > > > implemented efficiently without implemented suspend/resume on >> > >> > > > server-side. >> > >> > > > > >> > >> > > > > Can anyone give me permissions to create IEP on Apache wiki? >> > >> > > > > >> > >> > > > > ср, 27 мар. 2019 г. в 11:59, Vladimir Ozerov < >> > >> voze...@gridgain.com>: >> > >> > > > > >> > >> > > > > > Hi Alex, >> > >> > > > > > >> > >> > > > > > My comments was only about the protocol. Getting current >> info >> > >> about >> > >> > > > > > transaction should be handled by the client itself. It is >> not >> > >> > > protocl's >> > >> > > > > > concern. Same about other APIs and behavior in case another >> > >> > > transaction >> > >> > > > > is >> > >> > > > > > attempted from the same thread. >> > >> > > > > > >> > >> > > > > > Putting protocol aside, transaction support is complicated >> > >> matter. >> > >> > I >> > >> > > > > would >> > >> > > > > > propose to route through IEP and wide community >> discussion. We >> > >> need >> > >> > > to >> > >> > > > > > review API and semantics very carefully, taking >> SUSPEND/RESUME >> > >> in >> > >> > > > count. >> > >> > > > > > Also I do not see how we support client transactions >> > efficiently >> > >> > > > without >> > >> > > > > > decoupling transactions from threads on the server side >> first. >> > >> > > Because >> > >> > > > > > without it you will need a dedicated server thread for >> every >> > >> > client's >> > >> > > > > > transaction which is slow and may even crash the server. >> > >> > > > > > >> > >> > > > > > Vladimir. >> > >> > > > > > >> > >> > > > > > On Wed, Mar 27, 2019 at 11:44 AM Alex Plehanov < >> > >> > > > plehanov.a...@gmail.com> >> > >> > > > > > wrote: >> > >> > > > > > >> > >> > > > > > > Vladimir, what if we want to get current transaction info >> > >> (tx() >> > >> > > > > method)? >> > >> > > > > > > >> > >> > > > > > > Does close() method mapped to TX_END(rollback)? >> > >> > > > > > > >> > >> > > > > > > For example, this code: >> > >> > > > > > > >> > >> > > > > > > try(tx = txStart()) { >> > >> > > > > > > tx.commit(); >> > >> > > > > > > } >> > >> > > > > > > >> > >> > > > > > > Will produce: >> > >> > > > > > > TX_START >> > >> > > > > > > TX_END(commit) >> > >> > > > > > > TX_END(rollback) >> > >> > > > > > > >> > >> > > > > > > Am I understand you right? >> > >> > > > > > > >> > >> > > > > > > About xid. There is yet another proposal. Use some unique >> > per >> > >> > > > > connection >> > >> > > > > > id >> > >> > > > > > > (integer, simple counter) for identifying the >> transaction on >> > >> > > > > > > commit/rollback message. The client gets this id from the >> > >> server >> > >> > > with >> > >> > > > > > > transaction info and sends it back to the server when >> trying >> > >> to >> > >> > > > > > > commit/rollback transaction. This id is not shown to >> users. >> > >> But >> > >> > > also >> > >> > > > we >> > >> > > > > > can >> > >> > > > > > > pass from server to client real transaction id (xid) with >> > >> > > transaction >> > >> > > > > > info >> > >> > > > > > > for diagnostic purposes. >> > >> > > > > > > >> > >> > > > > > > And one more question: what should we do if the client >> > starts >> > >> a >> > >> > new >> > >> > > > > > > transaction without ending the old one? Should we end the >> > old >> > >> > > > > transaction >> > >> > > > > > > implicitly (rollback) or throw an exception to the >> client? >> > In >> > >> my >> > >> > > > > opinion, >> > >> > > > > > > the first option is better. For example, if we got a >> > >> previously >> > >> > > used >> > >> > > > > > > connection from the connection pool, we should not worry >> > about >> > >> > any >> > >> > > > > > > uncompleted transaction started by the previous user of >> this >> > >> > > > > connection. >> > >> > > > > > > >> > >> > > > > > > ср, 27 мар. 2019 г. в 11:02, Vladimir Ozerov < >> > >> > voze...@gridgain.com >> > >> > > >: >> > >> > > > > > > >> > >> > > > > > > > As far as SUSPEND/RESUME/SAVEPOINT - we do not support >> > them >> > >> > yet, >> > >> > > > and >> > >> > > > > > > adding >> > >> > > > > > > > them in future should not conflict with simple >> START/END >> > >> > > > > > infrastructure. >> > >> > > > > > > > >> > >> > > > > > > > On Wed, Mar 27, 2019 at 11:00 AM Vladimir Ozerov < >> > >> > > > > voze...@gridgain.com >> > >> > > > > > > >> > >> > > > > > > > wrote: >> > >> > > > > > > > >> > >> > > > > > > > > Hi Alex, >> > >> > > > > > > > > >> > >> > > > > > > > > I am not sure we need 5 commands. Wouldn't it be >> enough >> > to >> > >> > have >> > >> > > > > only >> > >> > > > > > > two? >> > >> > > > > > > > > >> > >> > > > > > > > > START - accepts optional parameters, returns >> transaction >> > >> info >> > >> > > > > > > > > END - provides commit flag, returns void >> > >> > > > > > > > > >> > >> > > > > > > > > Vladimir. >> > >> > > > > > > > > >> > >> > > > > > > > > On Wed, Mar 27, 2019 at 8:26 AM Alex Plehanov < >> > >> > > > > > plehanov.a...@gmail.com >> > >> > > > > > > > >> > >> > > > > > > > > wrote: >> > >> > > > > > > > > >> > >> > > > > > > > >> Sergey, yes, the close is something like silent >> > rollback. >> > >> > But >> > >> > > we >> > >> > > > > can >> > >> > > > > > > > >> also implement this on the client side, just using >> > >> rollback >> > >> > > and >> > >> > > > > > > ignoring >> > >> > > > > > > > >> errors in the response. >> > >> > > > > > > > >> >> > >> > > > > > > > >> ср, 27 мар. 2019 г. в 00:04, Sergey Kozlov < >> > >> > > > skoz...@gridgain.com >> > >> > > > > >: >> > >> > > > > > > > >> >> > >> > > > > > > > >> > Nikolay >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > Am I correctly understand you points: >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > - close: rollback >> > >> > > > > > > > >> > - commit, close: do nothing >> > >> > > > > > > > >> > - rollback, close: do what? (I suppose nothing) >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > Also you assume that after commit/rollback we may >> > need >> > >> to >> > >> > > free >> > >> > > > > > some >> > >> > > > > > > > >> > resources on server node(s)or just do on client >> > started >> > >> > TX? >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > On Tue, Mar 26, 2019 at 10:41 PM Alex Plehanov < >> > >> > > > > > > > plehanov.a...@gmail.com >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > wrote: >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > > Sergey, we have the close() method in the thick >> > >> client, >> > >> > > it's >> > >> > > > > > > > behavior >> > >> > > > > > > > >> is >> > >> > > > > > > > >> > > slightly different than rollback() method (it >> > should >> > >> > > > rollback >> > >> > > > > if >> > >> > > > > > > the >> > >> > > > > > > > >> > > transaction is not committed and do nothing if >> the >> > >> > > > transaction >> > >> > > > > > is >> > >> > > > > > > > >> already >> > >> > > > > > > > >> > > committed). I think we should support >> > >> try-with-resource >> > >> > > > > > semantics >> > >> > > > > > > in >> > >> > > > > > > > >> the >> > >> > > > > > > > >> > > thin client and OP_TX_CLOSE will be useful here. >> > >> > > > > > > > >> > > >> > >> > > > > > > > >> > > Nikolay, suspend/resume didn't work yet for >> > >> pessimistic >> > >> > > > > > > > transactions. >> > >> > > > > > > > >> > Also, >> > >> > > > > > > > >> > > the main goal of suspend/resume operations is to >> > >> support >> > >> > > > > > > transaction >> > >> > > > > > > > >> > > passing between threads. In the thin client, the >> > >> > > transaction >> > >> > > > > is >> > >> > > > > > > > bound >> > >> > > > > > > > >> to >> > >> > > > > > > > >> > > the client connection, not client thread. I >> think >> > >> > passing >> > >> > > a >> > >> > > > > > > > >> transaction >> > >> > > > > > > > >> > > between different client connections is not a >> very >> > >> > useful >> > >> > > > > case. >> > >> > > > > > > > >> > > >> > >> > > > > > > > >> > > вт, 26 мар. 2019 г. в 22:17, Nikolay Izhikov < >> > >> > > > > > nizhi...@apache.org >> > >> > > > > > > >: >> > >> > > > > > > > >> > > >> > >> > > > > > > > >> > > > Hello, Alex. >> > >> > > > > > > > >> > > > >> > >> > > > > > > > >> > > > We also have suspend and resume operations. >> > >> > > > > > > > >> > > > I think we should support them >> > >> > > > > > > > >> > > > >> > >> > > > > > > > >> > > > вт, 26 марта 2019 г., 22:07 Sergey Kozlov < >> > >> > > > > > skoz...@gridgain.com >> > >> > > > > > > >: >> > >> > > > > > > > >> > > > >> > >> > > > > > > > >> > > > > Hi >> > >> > > > > > > > >> > > > > >> > >> > > > > > > > >> > > > > Looks like I missed something but why we >> need >> > >> > > > OP_TX_CLOSE >> > >> > > > > > > > >> operation? >> > >> > > > > > > > >> > > > > >> > >> > > > > > > > >> > > > > Also I suggest to reserve a code for >> SAVEPOINT >> > >> > > operation >> > >> > > > > > which >> > >> > > > > > > > >> very >> > >> > > > > > > > >> > > > useful >> > >> > > > > > > > >> > > > > to understand where transaction has been >> rolled >> > >> back >> > >> > > > > > > > >> > > > > >> > >> > > > > > > > >> > > > > On Tue, Mar 26, 2019 at 6:07 PM Alex >> Plehanov < >> > >> > > > > > > > >> > plehanov.a...@gmail.com >> > >> > > > > > > > >> > > > >> > >> > > > > > > > >> > > > > wrote: >> > >> > > > > > > > >> > > > > >> > >> > > > > > > > >> > > > > > Hello Igniters! >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > I want to pick up the ticket IGNITE-7369 >> and >> > >> add >> > >> > > > > > > transactions >> > >> > > > > > > > >> > support >> > >> > > > > > > > >> > > > to >> > >> > > > > > > > >> > > > > > our thin client implementation. >> > >> > > > > > > > >> > > > > > I've looked at our current implementation >> and >> > >> have >> > >> > > > some >> > >> > > > > > > > >> proposals >> > >> > > > > > > > >> > to >> > >> > > > > > > > >> > > > > > support transactions: >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > Add new operations to thin client >> protocol: >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > OP_TX_GET, 4000, Get current >> transaction >> > >> for >> > >> > > > client >> > >> > > > > > > > >> connection >> > >> > > > > > > > >> > > > > > OP_TX_START, 4001, Start a new >> > transaction >> > >> > > > > > > > >> > > > > > OP_TX_COMMIT, 4002, Commit transaction >> > >> > > > > > > > >> > > > > > OP_TX_ROLLBACK, 4003, Rollback >> > transaction >> > >> > > > > > > > >> > > > > > OP_TX_CLOSE, 4004, Close transaction >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > From the client side (java) new interfaces >> > >> will be >> > >> > > > > added: >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > public interface ClientTransactions { >> > >> > > > > > > > >> > > > > > public ClientTransaction txStart(); >> > >> > > > > > > > >> > > > > > public ClientTransaction >> > >> > > > > > txStart(TransactionConcurrency >> > >> > > > > > > > >> > > > concurrency, >> > >> > > > > > > > >> > > > > > TransactionIsolation isolation); >> > >> > > > > > > > >> > > > > > public ClientTransaction >> > >> > > > > > txStart(TransactionConcurrency >> > >> > > > > > > > >> > > > concurrency, >> > >> > > > > > > > >> > > > > > TransactionIsolation isolation, long >> timeout, >> > >> int >> > >> > > > > txSize); >> > >> > > > > > > > >> > > > > > public ClientTransaction tx(); // Get >> > >> current >> > >> > > > > > connection >> > >> > > > > > > > >> > > > transaction >> > >> > > > > > > > >> > > > > > public ClientTransactions >> > withLabel(String >> > >> > lb); >> > >> > > > > > > > >> > > > > > } >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > public interface ClientTransaction extends >> > >> > > > > AutoCloseable { >> > >> > > > > > > > >> > > > > > public IgniteUuid xid(); // Do we need >> > it? >> > >> > > > > > > > >> > > > > > public TransactionIsolation >> isolation(); >> > >> > > > > > > > >> > > > > > public TransactionConcurrency >> > >> concurrency(); >> > >> > > > > > > > >> > > > > > public long timeout(); >> > >> > > > > > > > >> > > > > > public String label(); >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > public void commit(); >> > >> > > > > > > > >> > > > > > public void rollback(); >> > >> > > > > > > > >> > > > > > public void close(); >> > >> > > > > > > > >> > > > > > } >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > From the server side, I think as a first >> step >> > >> > (while >> > >> > > > > > > > >> transactions >> > >> > > > > > > > >> > > > > > suspend/resume is not fully implemented) >> we >> > can >> > >> > use >> > >> > > > the >> > >> > > > > > same >> > >> > > > > > > > >> > approach >> > >> > > > > > > > >> > > > as >> > >> > > > > > > > >> > > > > > for JDBC: add a new worker to each >> > >> > > > ClientRequestHandler >> > >> > > > > > and >> > >> > > > > > > > >> process >> > >> > > > > > > > >> > > > > > requests by this worker if the >> transaction is >> > >> > > started >> > >> > > > > > > > >> explicitly. >> > >> > > > > > > > >> > > > > > ClientRequestHandler is bound to client >> > >> > connection, >> > >> > > so >> > >> > > > > > there >> > >> > > > > > > > >> will >> > >> > > > > > > > >> > be >> > >> > > > > > > > >> > > > 1:1 >> > >> > > > > > > > >> > > > > > relation between client connection and >> > thread, >> > >> > which >> > >> > > > > > process >> > >> > > > > > > > >> > > operations >> > >> > > > > > > > >> > > > > in >> > >> > > > > > > > >> > > > > > a transaction. >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > Also, there is a couple of issues I want >> to >> > >> > discuss: >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > We have overloaded method txStart with a >> > >> different >> > >> > > set >> > >> > > > > of >> > >> > > > > > > > >> > arguments. >> > >> > > > > > > > >> > > > Some >> > >> > > > > > > > >> > > > > > of the arguments may be missing. To pass >> > >> arguments >> > >> > > > with >> > >> > > > > > > > >> OP_TX_START >> > >> > > > > > > > >> > > > > > operation we have the next options: >> > >> > > > > > > > >> > > > > > * Serialize full set of arguments and use >> > some >> > >> > > value >> > >> > > > > for >> > >> > > > > > > > >> missing >> > >> > > > > > > > >> > > > > > arguments. For example -1 for int/long >> types >> > >> and >> > >> > > null >> > >> > > > > for >> > >> > > > > > > > string >> > >> > > > > > > > >> > > type. >> > >> > > > > > > > >> > > > We >> > >> > > > > > > > >> > > > > > can't use 0 for int/long types since 0 >> it's a >> > >> > valid >> > >> > > > > value >> > >> > > > > > > for >> > >> > > > > > > > >> > > > > concurrency, >> > >> > > > > > > > >> > > > > > isolation and timeout arguments. >> > >> > > > > > > > >> > > > > > * Serialize arguments as a collection of >> > >> > > > property-value >> > >> > > > > > > pairs >> > >> > > > > > > > >> > (like >> > >> > > > > > > > >> > > > it's >> > >> > > > > > > > >> > > > > > implemented now for CacheConfiguration). >> In >> > >> this >> > >> > > case >> > >> > > > > only >> > >> > > > > > > > >> > explicitly >> > >> > > > > > > > >> > > > > > provided arguments will be serialized. >> > >> > > > > > > > >> > > > > > Which way is better? The simplest >> solution is >> > >> to >> > >> > use >> > >> > > > the >> > >> > > > > > > first >> > >> > > > > > > > >> > option >> > >> > > > > > > > >> > > > > and I >> > >> > > > > > > > >> > > > > > want to use it if there were no >> objections. >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > Do we need transaction id (xid) on the >> client >> > >> > side? >> > >> > > > > > > > >> > > > > > If yes, we can pass xid along with >> > >> OP_TX_COMMIT, >> > >> > > > > > > > OP_TX_ROLLBACK, >> > >> > > > > > > > >> > > > > > OP_TX_CLOSE operations back to the server >> and >> > >> do >> > >> > > > > > additional >> > >> > > > > > > > >> check >> > >> > > > > > > > >> > on >> > >> > > > > > > > >> > > > the >> > >> > > > > > > > >> > > > > > server side (current transaction id for >> > >> connection >> > >> > > == >> > >> > > > > > > > >> transaction >> > >> > > > > > > > >> > id >> > >> > > > > > > > >> > > > > passed >> > >> > > > > > > > >> > > > > > from client side). This, perhaps, will >> > protect >> > >> > > clients >> > >> > > > > > > against >> > >> > > > > > > > >> some >> > >> > > > > > > > >> > > > > errors >> > >> > > > > > > > >> > > > > > (for example when client try to commit >> > outdated >> > >> > > > > > > transaction). >> > >> > > > > > > > >> But >> > >> > > > > > > > >> > > > > > currently, we don't have data type >> IgniteUuid >> > >> in >> > >> > > thin >> > >> > > > > > client >> > >> > > > > > > > >> > > protocol. >> > >> > > > > > > > >> > > > Do >> > >> > > > > > > > >> > > > > > we need to add it too? >> > >> > > > > > > > >> > > > > > Also, we can pass xid as a string just to >> > >> inform >> > >> > the >> > >> > > > > > client >> > >> > > > > > > > and >> > >> > > > > > > > >> do >> > >> > > > > > > > >> > > not >> > >> > > > > > > > >> > > > > pass >> > >> > > > > > > > >> > > > > > it back to the server with commit/rollback >> > >> > > operation. >> > >> > > > > > > > >> > > > > > Or not to pass xid at all (.NET thick >> client >> > >> works >> > >> > > > this >> > >> > > > > > way >> > >> > > > > > > as >> > >> > > > > > > > >> far >> > >> > > > > > > > >> > > as I >> > >> > > > > > > > >> > > > > > know). >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > What do you think? >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > ср, 7 мар. 2018 г. в 16:22, Vladimir >> Ozerov < >> > >> > > > > > > > >> voze...@gridgain.com >> > >> > > > > > > > >> > >: >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > > > We already have transactions support in >> > JDBC >> > >> > > driver >> > >> > > > in >> > >> > > > > > TX >> > >> > > > > > > > SQL >> > >> > > > > > > > >> > > branch >> > >> > > > > > > > >> > > > > > > (ignite-4191). Currently it is >> implemented >> > >> > through >> > >> > > > > > > separate >> > >> > > > > > > > >> > thread, >> > >> > > > > > > > >> > > > > which >> > >> > > > > > > > >> > > > > > > is not that efficient. Ideally we need >> to >> > >> finish >> > >> > > > > > > decoupling >> > >> > > > > > > > >> > > > > transactions >> > >> > > > > > > > >> > > > > > > from threads. But alternatively we can >> > change >> > >> > the >> > >> > > > > logic >> > >> > > > > > on >> > >> > > > > > > > >> how we >> > >> > > > > > > > >> > > > > assign >> > >> > > > > > > > >> > > > > > > thread ID to specific transaction and >> > >> > > "impersonate" >> > >> > > > > thin >> > >> > > > > > > > >> client >> > >> > > > > > > > >> > > > worker >> > >> > > > > > > > >> > > > > > > threads when serving requests from >> multiple >> > >> > users. >> > >> > > > > > > > >> > > > > > > >> > >> > > > > > > > >> > > > > > > >> > >> > > > > > > > >> > > > > > > >> > >> > > > > > > > >> > > > > > > On Tue, Mar 6, 2018 at 10:01 PM, Denis >> > Magda >> > >> < >> > >> > > > > > > > >> dma...@apache.org> >> > >> > > > > > > > >> > > > > wrote: >> > >> > > > > > > > >> > > > > > > >> > >> > > > > > > > >> > > > > > > > Here is an original discussion with a >> > >> > reference >> > >> > > to >> > >> > > > > the >> > >> > > > > > > > JIRA >> > >> > > > > > > > >> > > ticket: >> > >> > > > > > > > >> > > > > > > > >> > >> > > http://apache-ignite-developers.2346864.n4.nabble >> > >> > > > . >> > >> > > > > > > > >> > > > > > > > >> > >> > > > > > > > >> > com/Re-Transaction-operations-using-the-Ignite-Thin-Client- >> > >> > > > > > > > >> > > > > > > > Protocol-td25914.html >> > >> > > > > > > > >> > > > > > > > >> > >> > > > > > > > >> > > > > > > > -- >> > >> > > > > > > > >> > > > > > > > Denis >> > >> > > > > > > > >> > > > > > > > >> > >> > > > > > > > >> > > > > > > > On Tue, Mar 6, 2018 at 9:18 AM, >> Dmitriy >> > >> > > Setrakyan >> > >> > > > < >> > >> > > > > > > > >> > > > > > dsetrak...@apache.org >> > >> > > > > > > > >> > > > > > > > >> > >> > > > > > > > >> > > > > > > > wrote: >> > >> > > > > > > > >> > > > > > > > >> > >> > > > > > > > >> > > > > > > > > Hi Dmitriy. I don't think we have a >> > >> design >> > >> > > > > proposal >> > >> > > > > > > for >> > >> > > > > > > > >> > > > transaction >> > >> > > > > > > > >> > > > > > > > support >> > >> > > > > > > > >> > > > > > > > > in thin clients. Do you mind taking >> > this >> > >> > > > > initiative >> > >> > > > > > > and >> > >> > > > > > > > >> > > creating >> > >> > > > > > > > >> > > > an >> > >> > > > > > > > >> > > > > > IEP >> > >> > > > > > > > >> > > > > > > > on >> > >> > > > > > > > >> > > > > > > > > Wiki? >> > >> > > > > > > > >> > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > D. >> > >> > > > > > > > >> > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > On Tue, Mar 6, 2018 at 8:46 AM, >> Dmitriy >> > >> > > > > Govorukhin < >> > >> > > > > > > > >> > > > > > > > > dmitriy.govoruk...@gmail.com> >> wrote: >> > >> > > > > > > > >> > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > > Hi, Igniters. >> > >> > > > > > > > >> > > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > > I've seen a lot of discussions >> about >> > >> thin >> > >> > > > client >> > >> > > > > > and >> > >> > > > > > > > >> binary >> > >> > > > > > > > >> > > > > > protocol, >> > >> > > > > > > > >> > > > > > > > > but I >> > >> > > > > > > > >> > > > > > > > > > did not hear anything about >> > >> transactions >> > >> > > > > support. >> > >> > > > > > Do >> > >> > > > > > > > we >> > >> > > > > > > > >> > have >> > >> > > > > > > > >> > > > some >> > >> > > > > > > > >> > > > > > > draft >> > >> > > > > > > > >> > > > > > > > > for >> > >> > > > > > > > >> > > > > > > > > > this purpose? >> > >> > > > > > > > >> > > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > > As I understand we have several >> > >> problems: >> > >> > > > > > > > >> > > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > > - thread and transaction have >> hard >> > >> > > related >> > >> > > > > (we >> > >> > > > > > > use >> > >> > > > > > > > >> > > > > thread-local >> > >> > > > > > > > >> > > > > > > > > variable >> > >> > > > > > > > >> > > > > > > > > > and thread name) >> > >> > > > > > > > >> > > > > > > > > > - we can process only one >> > >> transaction >> > >> > at >> > >> > > > the >> > >> > > > > > same >> > >> > > > > > > > >> time >> > >> > > > > > > > >> > in >> > >> > > > > > > > >> > > > one >> > >> > > > > > > > >> > > > > > > thread >> > >> > > > > > > > >> > > > > > > > > (it >> > >> > > > > > > > >> > > > > > > > > > mean we need hold thread per >> > >> client. If >> > >> > > > > connect >> > >> > > > > > > 100 >> > >> > > > > > > > >> thin >> > >> > > > > > > > >> > > > > clients >> > >> > > > > > > > >> > > > > > > to >> > >> > > > > > > > >> > > > > > > > 1 >> > >> > > > > > > > >> > > > > > > > > > server node, then need to hold >> 100 >> > >> > thread >> > >> > > > on >> > >> > > > > > the >> > >> > > > > > > > >> server >> > >> > > > > > > > >> > > > side) >> > >> > > > > > > > >> > > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > > Let's discuss how we can implement >> > >> > > > transactions >> > >> > > > > > for >> > >> > > > > > > > the >> > >> > > > > > > > >> > thin >> > >> > > > > > > > >> > > > > > client. >> > >> > > > > > > > >> > > > > > > > > > >> > >> > > > > > > > >> > > > > > > > > >> > >> > > > > > > > >> > > > > > > > >> > >> > > > > > > > >> > > > > > > >> > >> > > > > > > > >> > > > > > >> > >> > > > > > > > >> > > > > >> > >> > > > > > > > >> > > > > >> > >> > > > > > > > >> > > > > -- >> > >> > > > > > > > >> > > > > Sergey Kozlov >> > >> > > > > > > > >> > > > > GridGain Systems >> > >> > > > > > > > >> > > > > www.gridgain.com >> > >> > > > > > > > >> > > > > >> > >> > > > > > > > >> > > > >> > >> > > > > > > > >> > > >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > >> > >> > > > > > > > >> > -- >> > >> > > > > > > > >> > Sergey Kozlov >> > >> > > > > > > > >> > GridGain Systems >> > >> > > > > > > > >> > www.gridgain.com >> > >> > > > > > > > >> > >> > >> > > > > > > > >> >> > >> > > > > > > > > >> > >> > > > > > > > >> > >> > > > > > > >> > >> > > > > > >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> >