myrocks之事務處理

2022-03-26 05:22:58 字數 2776 閱讀 3211

mysql目前支援的事務引擎有innodb,tokudb. rocksdb加入mysql陣營後,mysql支援的事務引擎增長至3個。

myrocks目前支援的事務隔離級別有read-committed和repeatable-read. 同innodb一樣,myrocks也支援mvcc機制。

可以說,myrocks提供了很好的事務支援,能夠滿足的一般業務的事務需求。

談到rocksdb事務,就必須提及rocksdb中的sequence number機制。rocksdb中的每一條記錄都有乙個sequence number, 這個sequence number儲存在記錄的key中。

internalkey: | user key (string) | sequence number (7 bytes) | value type (1 byte) |
對於同樣的user key記錄,在rocksdb中可能存在多條,但他們的sequence number不同。

sequence number是實現事務處理的關鍵,同時也是mvcc的基礎。

snapshot是rocksdb的快照資訊,snapshot實際就是對應乙個sequence number. 

簡單的講,假設snapshot的sequence number為sa, 那麼對於此snapshot來說,只能看到sequence number<=sa的記錄,sequence number<=sa的記錄是不可見的。

class snapshotimpl : public

snapshot ;

有了snapshot,mvcc實現起來就很順利了。記錄的sequence number天然的提供了記錄的多版本資訊。

每次查詢使用者記錄時,並不需要加鎖。而是根據當前的sequence number sn建立乙個snapshot, 查詢過程中只取小於或等於sn的最大sequence number的記錄。查詢結束時釋放snapshot.

關鍵**段

dbiter::findnextuserentryinternal

if (ikey.sequence <=sequence_)

else

rocksdb::status ha_rocksdb::get_for_update(

rdb_transaction*tx,

rocksdb::columnfamilyhandle*column_family,

const rocksdb::slice&key,

std::

string* value) const

return

s;}

innodb不會出現上述情況,當第乙個大事更新是會持有b樹的index lock, 第二個事務會一直等待index lock直至第乙個事務提交完成。

myrocks目前只支援一種鎖型別:排他鎖(x鎖),並且所有的鎖資訊都儲存在記憶體中。

struct

lockinfo

每個鎖實際是key和lockinfo的對映. 鎖資訊都儲存在map中

struct

lockmapstripe

為了減少全域性鎖資訊訪問的衝突, rocksdb將鎖資訊進行按key hash分割槽,

struct

lockmap

同時每個column family 儲存乙個這樣的lockmap.

using lockmaps = std::unordered_map>;

lockmaps lock_maps_;

max_num_locks:事務鎖個數限制

expiration:事務過期時間

通過設定以上兩個引數,來控制事務鎖占用過多的記憶體。

rocksdb內部實現了簡單的死鎖檢測機制,每次加鎖發生等待時都會向下面的map中插入一條等待資訊,表示乙個事務id等待另乙個事務id.

同時會檢查wait_txn_map_是否存在等待環路,存在環路則發生死鎖。

std::unordered_mapwait_txn_map_;
死鎖檢測關鍵**片段

transactionlockmgr::incrementwaiters:

for (int i = 0; i < txn->getdeadlockdetectdepth(); i++)

else

if (wait_txn_map_.count(next) == 0

) else

}

死鎖檢測相關引數

deadlock_detect:是否開啟死鎖檢測

deadlock_detect_depth:死鎖檢查深度,預設50

myrocks最近也支援了binlog xa.

在開啟binlog的情況下,myrocks提交時,會經歷兩階段提交階段。

prepare階段,根據server層生成的xid(由mysqlxid+server_id+qurey_id組成),在rockdb內部執行2pc操作,生成prepare(xid),endprepare()記錄。

commit階段,根據事務成還是失敗,生成commit(xid)或rollback(xid)記錄。

rocksdb 2pc參考這裡

myrocks在事務處理方面還有些不完善的地方,比如鎖型別只有單一的x鎖,不支援gap lock,純記憶體鎖占用記憶體等。 myrocks社群正在持續改進中,一起期待。

JDBC之事務處理

try catch 首先開啟事務,然後執行dml操作,如果所有的dml操作都正確執行,則使用commit提交事務 如果有的dml操作不能正確執行,則捕獲該異常,跳過commit語句,在catch語句塊中使用rollback回滾事務。public class test catch exception ...

MySQL之事務處理

原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務前後資料的完整性必須保持一致。隔離性 isolation 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所...

深入理解hive之事務處理

1.automicity 原子性 2.consistency 一致性 3.isolation 獨立性 4.durability 永續性 5.支援事務有幾個條件需要滿足 1.所有的事務都支援自動提交 2.只支援orc格式的資料 3.桶表 7.配置hive的引數使其支援事務 在hive site.xml...