Loading mysql-test/r/ndb_lock.result +12 −3 Original line number Diff line number Diff line Loading @@ -64,17 +64,26 @@ pk u o insert into t1 values (1,1,1); drop table t1; create table t1 (x integer not null primary key, y varchar(32), z integer, key(z)) engine = ndb; insert into t1 values (1,'one',1), (2,'two',2),(3,"three",3); insert into t1 values (1,'one',1); begin; select * from t1 where x = 1 for update; x y z 1 one 1 begin; select * from t1 where x = 2 for update; select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; rollback; insert into t1 values (2,'two',2),(3,"three",3); begin; select * from t1 where x = 1 for update; x y z 2 two 2 1 one 1 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction select * from t1 where x = 2 for update; x y z 2 two 2 rollback; commit; begin; Loading mysql-test/t/ndb_lock.test +13 −2 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ drop table t1; create table t1 (x integer not null primary key, y varchar(32), z integer, key(z)) engine = ndb; insert into t1 values (1,'one',1), (2,'two',2),(3,"three",3); insert into t1 values (1,'one',1); # PK access connection con1; Loading @@ -82,11 +82,22 @@ select * from t1 where x = 1 for update; connection con2; begin; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; connection con1; rollback; insert into t1 values (2,'two',2),(3,"three",3); begin; select * from t1 where x = 1 for update; connection con2; --error 1205 select * from t1 where x = 1 for update; select * from t1 where x = 2 for update; rollback; connection con1; commit; Loading ndb/include/ndbapi/NdbConnection.hpp +3 −1 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ class NdbConnection friend class NdbIndexOperation; friend class NdbIndexScanOperation; friend class NdbBlob; friend class ha_ndbcluster; public: Loading Loading @@ -675,6 +676,7 @@ private: // optim: any blobs bool theBlobFlag; Uint8 thePendingBlobOps; inline bool hasBlobOperation() { return theBlobFlag; } static void sendTC_COMMIT_ACK(NdbApiSignal *, Uint32 transId1, Uint32 transId2, Loading sql/ha_ndbcluster.cc +34 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,7 @@ int execute_no_commit(ha_ndbcluster *h, NdbConnection *trans) if (m_batch_execute) return 0; #endif h->release_completed_operations(trans); return trans->execute(NoCommit,AbortOnError,h->m_force_send); } Loading Loading @@ -194,6 +195,7 @@ int execute_no_commit_ie(ha_ndbcluster *h, NdbConnection *trans) if (m_batch_execute) return 0; #endif h->release_completed_operations(trans); return trans->execute(NoCommit, AO_IgnoreError,h->m_force_send); } Loading Loading @@ -2747,6 +2749,25 @@ int ha_ndbcluster::close_scan() if (!cursor) DBUG_RETURN(1); if (m_lock_tuple) { /* Lock level m_lock.type either TL_WRITE_ALLOW_WRITE (SELECT FOR UPDATE) or TL_READ_WITH_SHARED_LOCKS (SELECT LOCK WITH SHARE MODE) and row was not explictly unlocked with unlock_row() call */ NdbOperation *op; // Lock row DBUG_PRINT("info", ("Keeping lock on scanned row")); if (!(op= m_active_cursor->lockTuple())) { m_lock_tuple= false; ERR_RETURN(trans->getNdbError()); } m_ops_pending++; } m_lock_tuple= false; if (m_ops_pending) { Loading Loading @@ -5350,6 +5371,19 @@ int ha_ndbcluster::write_ndb_file() DBUG_RETURN(error); } void ha_ndbcluster::release_completed_operations(NdbConnection *trans) { if (trans->hasBlobOperation()) { /* We are reading/writing BLOB fields, releasing operation records is unsafe */ return; } trans->releaseCompletedOperations(); } int ndbcluster_show_status(THD* thd) { Loading sql/ha_ndbcluster.h +2 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,8 @@ class ha_ndbcluster: public handler void no_uncommitted_rows_init(THD *); void no_uncommitted_rows_reset(THD *); void release_completed_operations(NdbConnection*); friend int execute_no_commit(ha_ndbcluster*, NdbConnection*); friend int execute_commit(ha_ndbcluster*, NdbConnection*); friend int execute_no_commit_ie(ha_ndbcluster*, NdbConnection*); Loading Loading
mysql-test/r/ndb_lock.result +12 −3 Original line number Diff line number Diff line Loading @@ -64,17 +64,26 @@ pk u o insert into t1 values (1,1,1); drop table t1; create table t1 (x integer not null primary key, y varchar(32), z integer, key(z)) engine = ndb; insert into t1 values (1,'one',1), (2,'two',2),(3,"three",3); insert into t1 values (1,'one',1); begin; select * from t1 where x = 1 for update; x y z 1 one 1 begin; select * from t1 where x = 2 for update; select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction rollback; rollback; insert into t1 values (2,'two',2),(3,"three",3); begin; select * from t1 where x = 1 for update; x y z 2 two 2 1 one 1 select * from t1 where x = 1 for update; ERROR HY000: Lock wait timeout exceeded; try restarting transaction select * from t1 where x = 2 for update; x y z 2 two 2 rollback; commit; begin; Loading
mysql-test/t/ndb_lock.test +13 −2 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ drop table t1; create table t1 (x integer not null primary key, y varchar(32), z integer, key(z)) engine = ndb; insert into t1 values (1,'one',1), (2,'two',2),(3,"three",3); insert into t1 values (1,'one',1); # PK access connection con1; Loading @@ -82,11 +82,22 @@ select * from t1 where x = 1 for update; connection con2; begin; select * from t1 where x = 2 for update; --error 1205 select * from t1 where x = 1 for update; rollback; connection con1; rollback; insert into t1 values (2,'two',2),(3,"three",3); begin; select * from t1 where x = 1 for update; connection con2; --error 1205 select * from t1 where x = 1 for update; select * from t1 where x = 2 for update; rollback; connection con1; commit; Loading
ndb/include/ndbapi/NdbConnection.hpp +3 −1 Original line number Diff line number Diff line Loading @@ -163,6 +163,7 @@ class NdbConnection friend class NdbIndexOperation; friend class NdbIndexScanOperation; friend class NdbBlob; friend class ha_ndbcluster; public: Loading Loading @@ -675,6 +676,7 @@ private: // optim: any blobs bool theBlobFlag; Uint8 thePendingBlobOps; inline bool hasBlobOperation() { return theBlobFlag; } static void sendTC_COMMIT_ACK(NdbApiSignal *, Uint32 transId1, Uint32 transId2, Loading
sql/ha_ndbcluster.cc +34 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,7 @@ int execute_no_commit(ha_ndbcluster *h, NdbConnection *trans) if (m_batch_execute) return 0; #endif h->release_completed_operations(trans); return trans->execute(NoCommit,AbortOnError,h->m_force_send); } Loading Loading @@ -194,6 +195,7 @@ int execute_no_commit_ie(ha_ndbcluster *h, NdbConnection *trans) if (m_batch_execute) return 0; #endif h->release_completed_operations(trans); return trans->execute(NoCommit, AO_IgnoreError,h->m_force_send); } Loading Loading @@ -2747,6 +2749,25 @@ int ha_ndbcluster::close_scan() if (!cursor) DBUG_RETURN(1); if (m_lock_tuple) { /* Lock level m_lock.type either TL_WRITE_ALLOW_WRITE (SELECT FOR UPDATE) or TL_READ_WITH_SHARED_LOCKS (SELECT LOCK WITH SHARE MODE) and row was not explictly unlocked with unlock_row() call */ NdbOperation *op; // Lock row DBUG_PRINT("info", ("Keeping lock on scanned row")); if (!(op= m_active_cursor->lockTuple())) { m_lock_tuple= false; ERR_RETURN(trans->getNdbError()); } m_ops_pending++; } m_lock_tuple= false; if (m_ops_pending) { Loading Loading @@ -5350,6 +5371,19 @@ int ha_ndbcluster::write_ndb_file() DBUG_RETURN(error); } void ha_ndbcluster::release_completed_operations(NdbConnection *trans) { if (trans->hasBlobOperation()) { /* We are reading/writing BLOB fields, releasing operation records is unsafe */ return; } trans->releaseCompletedOperations(); } int ndbcluster_show_status(THD* thd) { Loading
sql/ha_ndbcluster.h +2 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,8 @@ class ha_ndbcluster: public handler void no_uncommitted_rows_init(THD *); void no_uncommitted_rows_reset(THD *); void release_completed_operations(NdbConnection*); friend int execute_no_commit(ha_ndbcluster*, NdbConnection*); friend int execute_commit(ha_ndbcluster*, NdbConnection*); friend int execute_no_commit_ie(ha_ndbcluster*, NdbConnection*); Loading