@@ -1912,15 +1912,18 @@ int ObMemtable::lock_row_on_frozen_stores(const ObStoreCtx& ctx, const ObMemtabl
19121912 ret = OB_ERR_UNEXPECTED;
19131913 TRANS_LOG (ERROR, " stores in context is null" , K (ret));
19141914 } else {
1915+ bool locked_by_self = false ;
19151916 int64_t max_trans_version = 0 ;
19161917 const ObIArray<ObITable*>* stores = ctx.tables_ ;
1918+ ObStoreRowLockState lock_state;
19171919
19181920 // ignore active memtable
19191921 for (int64_t i = stores->count () - 2 ; OB_SUCC (ret) && i >= 0 ; i--) {
19201922 int64_t current_version = 0 ;
19211923 bool is_locked = false ;
19221924 uint32_t lock_descriptor = 0 ;
1923- ObStoreRowLockState lock_state;
1925+
1926+ lock_state.reset ();
19241927
19251928 if (NULL == stores->at (i)) {
19261929 ret = OB_ERR_UNEXPECTED;
@@ -1929,14 +1932,21 @@ int ObMemtable::lock_row_on_frozen_stores(const ObStoreCtx& ctx, const ObMemtabl
19291932 ObMemtable* memtable = static_cast <ObMemtable*>(stores->at (i));
19301933 if (OB_FAIL (memtable->get_mvcc_engine ().check_row_locked (
19311934 *ctx.mem_ctx_ , key, is_locked, lock_descriptor, current_version))) {
1932- TRANS_LOG (WARN, " mvcc engine check row lock fail" , K (ret), K (is_locked), K (lock_descriptor));
1935+ TRANS_LOG (WARN,
1936+ " mvcc engine check row lock fail, may be locked by other" ,
1937+ K (ret),
1938+ K (is_locked),
1939+ K (lock_descriptor));
1940+ } else {
1941+ locked_by_self |= is_locked && lock_descriptor == ctx.mem_ctx_ ->get_ctx_descriptor ();
19331942 }
19341943 } else if (stores->at (i)->is_sstable ()) {
19351944 ObSSTable* sstable = static_cast <ObSSTable*>(stores->at (i));
19361945 if (OB_FAIL (sstable->check_row_locked (ctx, *key->get_rowkey (), columns, lock_state))) {
19371946 TRANS_LOG (WARN, " failed to check row lock by other" , K (ret), K (*key), K (lock_state));
19381947 } else {
19391948 current_version = lock_state.trans_version_ ;
1949+ locked_by_self |= lock_state.is_locked_ && ctx.trans_id_ == lock_state.lock_trans_id_ ;
19401950 }
19411951 TRANS_LOG (DEBUG, " check_row_locked meet sstable" , K (ret), K (*key), K (*sstable), K (current_version));
19421952 } else {
@@ -1945,16 +1955,27 @@ int ObMemtable::lock_row_on_frozen_stores(const ObStoreCtx& ctx, const ObMemtabl
19451955 }
19461956
19471957 max_trans_version = max (max_trans_version, current_version);
1948- TRANS_LOG (DEBUG, " check_row_locked" , K (i), K (stores->count ()), K (stores->at (i)));
1958+ TRANS_LOG (DEBUG,
1959+ " check_row_locked" ,
1960+ K (i),
1961+ K (stores->count ()),
1962+ K (stores->at (i)),
1963+ K (locked_by_self),
1964+ K (current_version),
1965+ K (max_trans_version));
19491966 }
19501967
19511968 if (OB_SUCC (ret)) {
19521969 value->update_max_trans_version (max_trans_version);
1953- value->set_lower_lock_scaned ();
1970+ if (!locked_by_self) {
1971+ // there is no locks on frozen stores
1972+ if (max_trans_version > ctx.mem_ctx_ ->get_read_snapshot ()) {
1973+ ret = OB_TRANSACTION_SET_VIOLATION;
1974+ TRANS_LOG (WARN, " TRANS_SET_VIOLATION" , K (ret), K (max_trans_version), " ctx" , ctx.mem_ctx_ );
1975+ }
19541976
1955- if (max_trans_version > ctx.mem_ctx_ ->get_read_snapshot ()) {
1956- ret = OB_TRANSACTION_SET_VIOLATION;
1957- TRANS_LOG (WARN, " TRANS_SET_VIOLATION" , K (ret), K (max_trans_version), " ctx" , ctx.mem_ctx_ );
1977+ value->set_lower_lock_scaned ();
1978+ TRANS_LOG (DEBUG, " lower lock check finish" , K (*value), K (*stores));
19581979 }
19591980 }
19601981 }
0 commit comments