Created tickets for transactional support of DML and SELECT statements on JDBC, ODBC and DML API sides https://issues.apache.org/jira/browse/IGNITE-4191 <https://issues.apache.org/jira/browse/IGNITE-4191>
The parent ticket depends on MVCC. — Denis > On Nov 8, 2016, at 11:51 AM, Sergi Vladykin <sergi.vlady...@gmail.com> wrote: > > Dmitriy, > > I don't see how we can support it without having all the complex MVCC > machinery that we are creating for 2.0 (and it is very far from being > ready). > > Sergi > > 2016-11-08 20:38 GMT+03:00 Dmitriy Setrakyan <dsetrak...@apache.org>: > >> I am not sure why we don't add the transaction support now, given that we >> are going to support insert, update, and delete statements. >> >> On Tue, Nov 8, 2016 at 4:50 AM, Sergi Vladykin <sergi.vlady...@gmail.com> >> wrote: >> >>> All the SQL statements currently run out of transactions. It is a big >>> feature for 2.0 >>> >>> Sergi >>> >>> 2016-11-08 15:09 GMT+03:00 Igor Sapego <isap...@gridgain.com>: >>> >>>> Hi, >>>> >>>> Currently, we do not support transaction in ODBC at all. I'm not quite >>>> sure >>>> about JDBC, but I believe we do not support them there either. As far as >>>> I know this is because we do not support transactions on the SQL level >>>> currently. Serge, can you confirm? >>>> >>>> >>>> Best Regards, >>>> Igor >>>> >>>> On Tue, Nov 8, 2016 at 12:46 AM, Dmitriy Setrakyan < >>>> dsetrak...@apache.org> >>>> wrote: >>>> >>>>> Couldn't agree more about ODBC and JDBC. We must support savepoints >>>> from >>>>> SLQ, given the DML functionality being planned for 1.8 release. >>>>> >>>>> On Mon, Nov 7, 2016 at 11:23 AM, Denis Magda <dma...@gridgain.com> >>>> wrote: >>>>> >>>>>> This is how how the savepoints are supported by PostgreSQL [1], Oracle >>>>>> [2] and MySQL [3]. The implementation details and behavior are pretty >>>> the >>>>>> same and similar to the Yakov’s proposal. >>>>>> >>>>>> It worth to note that all the engines support multiple savepoints per >>>>>> transaction named uniquely and the RELEASE statement. If the one >>>> start a >>>>>> second savepoint with the name of an already existed one then the old >>>>>> savepoint will be erased/deleted. >>>>>> >>>>>> In addition it makes sense to support the feature at the level of our >>>>>> JDBC [4] and ODBC creating respective sub-tasks. Igor, I’ve googled >>>> that >>>>>> ODBC supports savepoints but didn’t succeed at finding exact APIs. >>>> Please >>>>>> assist. >>>>>> >>>>>> [1] https://www.postgresql.org/docs/8.1/static/sql-savepoint.html < >>>>>> https://www.postgresql.org/docs/8.1/static/sql-savepoint.html> >>>>>> [2] https://docs.oracle.com/cd/B19306_01/server.102/b14200/state >>>>>> ments_10001.htm <https://docs.oracle.com/cd/B1 >>>>>> 9306_01/server.102/b14200/statements_10001.htm> >>>>>> [3] http://dev.mysql.com/doc/refman/5.7/en/savepoint.html < >>>>>> http://dev.mysql.com/doc/refman/5.7/en/savepoint.html> >>>>>> >>>>>> [4] https://docs.oracle.com/javase/tutorial/jdbc/basics/transact >>>>>> ions.html#set_roll_back_savepoints >>>>>> >>>>>> — >>>>>> Denis >>>>>> >>>>>>> On Nov 7, 2016, at 9:13 AM, Dmitriy Setrakyan < >>>> dsetrak...@apache.org> >>>>>> wrote: >>>>>>> >>>>>>> Does anyone know how MySQL or PostgreSQL work with checkpoints? Do >>>> they >>>>>>> support it in a similar way? >>>>>>> >>>>>>> On Mon, Nov 7, 2016 at 5:58 AM, Yakov Zhdanov <yzhda...@apache.org> >>>>>> wrote: >>>>>>> >>>>>>>> Alex, I think we should put consecutive checkpoints to stack thus >>>> your >>>>>>>> example should be illegal and should result to exception. And we >>>> will >>>>>> throw >>>>>>>> exception on rollback to CP if CP is not defined. >>>>>>>> >>>>>>>> --Yakov >>>>>>>> >>>>>>>> 2016-11-07 14:23 GMT+03:00 Alexey Goncharuk < >>>>>> alexey.goncha...@gmail.com>: >>>>>>>> >>>>>>>>> We also should define savepoint behavior and API rules for each >>>> of the >>>>>>>>> transaction concurrency and isolation types. >>>>>>>>> >>>>>>>>> * Should rollbackToSavepoint() always release locks or clear saved >>>>>>>>> optimistic versions? >>>>>>>>> * Are forward-rollbacks allowed, e.g. >>>>>>>>> >>>>>>>>> try (Transaction tx = ignite.transactions().txStart()) { >>>>>>>>> c.put(1, 1); >>>>>>>>> >>>>>>>>> tx.savepoint("sp1"); >>>>>>>>> >>>>>>>>> c.put(2, 2); >>>>>>>>> >>>>>>>>> tx.savepoint("sp2") >>>>>>>>> >>>>>>>>> c.put(3, 3); >>>>>>>>> >>>>>>>>> tx.rollbackToSavepoint("sp1"); >>>>>>>>> >>>>>>>>> c.put(4, 4); >>>>>>>>> >>>>>>>>> tx.rollbackToSavepoint("sp2"); // Is this allowed? >>>>>>>>> >>>>>>>>> tx.commit(); >>>>>>>>> } >>>>>>>>> >>>>>>>>> >>>>>>>>> 2016-11-07 13:47 GMT+03:00 Sergey Kozlov <skoz...@gridgain.com>: >>>>>>>>> >>>>>>>>>> Hi, Yakov >>>>>>>>>> >>>>>>>>>> I suppose it's very very handy feature. >>>>>>>>>> My two cents are following: >>>>>>>>>> - number of savepoints may be more than one per transaction >>>>>>>>>> - what's about RELEASE SAVEPOINT statement? >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Mon, Nov 7, 2016 at 11:24 AM, Yakov Zhdanov < >>>> yzhda...@apache.org> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Guys, >>>>>>>>>>> >>>>>>>>>>> Let's think of implementing savepoints for Ignite transactions. >>>> For >>>>>>>> me, >>>>>>>>>>> this is not too hard to do. >>>>>>>>>>> >>>>>>>>>>> Having "savepoints" seems to be pretty handy. Please consider >>>> the >>>>>>>>>> following >>>>>>>>>>> snippet. >>>>>>>>>>> >>>>>>>>>>> ignite.transactions.; >>>>>>>>>>> INSERT INTO table1 VALUES (1); >>>>>>>>>>> SAVEPOINT my_savepoint; >>>>>>>>>>> INSERT INTO table1 VALUES (2); >>>>>>>>>>> ROLLBACK TO SAVEPOINT my_savepoint; >>>>>>>>>>> INSERT INTO table1 VALUES (3); >>>>>>>>>>> COMMIT; >>>>>>>>>>> >>>>>>>>>>> Which should result in values 1 and 3 inserted to table1. >>>>>>>>>>> >>>>>>>>>>> In Ignite, I think, it would be like the following (preserving >>>> the >>>>>>>>> same >>>>>>>>>>> behavior as above). >>>>>>>>>>> >>>>>>>>>>> Ignite ignite = ....; >>>>>>>>>>> IgniteCache<Integer, Integer> c = ....; >>>>>>>>>>> >>>>>>>>>>> try (Transaction tx = ignite.transactions().txStart()) { >>>>>>>>>>> c.put(1, 1); >>>>>>>>>>> >>>>>>>>>>> tx.savepoint("mysavepoint"); >>>>>>>>>>> >>>>>>>>>>> c.put(2, 2); >>>>>>>>>>> >>>>>>>>>>> tx.rollbackToSavepoint("mysavepoint"); >>>>>>>>>>> >>>>>>>>>>> c.put(3, 3); >>>>>>>>>>> >>>>>>>>>>> tx.commit(); >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> As far as implementation complexity I would give 2 weeks >>>> ballpark. >>>>>>>>>>> >>>>>>>>>>> 5 days - API design and implementation for different types of >>>>>>>>>> transactions >>>>>>>>>>> - savepoint implementation for local transaction objects >>>>>>>>>>> - rollback implementation for different types of transactions - >>>>>> drain >>>>>>>>>> local >>>>>>>>>>> tx buffers, release remote locks for pessimistic transactions, >>>> etc. >>>>>>>>>>> >>>>>>>>>>> 5 days - testing, benchmarking, fixing issues. >>>>>>>>>>> >>>>>>>>>>> Please leave your comments here. I will file a ticket after we >>>>>>>> discuss >>>>>>>>>> this >>>>>>>>>>> and put our summary to it. >>>>>>>>>>> >>>>>>>>>>> Thanks! >>>>>>>>>>> >>>>>>>>>>> --Yakov >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Sergey Kozlov >>>>>>>>>> GridGain Systems >>>>>>>>>> www.gridgain.com >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >>> >>