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,mvcc實現起來就很順利了。記錄的sequence number天然的提供了記錄的多版本資訊。snapshot ;
每次查詢使用者記錄時,並不需要加鎖。而是根據當前的sequence number sn建立乙個snapshot, 查詢過程中只取小於或等於sn的最大sequence number的記錄。查詢結束時釋放snapshot.
關鍵**段
dbiter::findnextuserentryinternalif (ikey.sequence <=sequence_)
else
rocksdb::status ha_rocksdb::get_for_update(innodb不會出現上述情況,當第乙個大事更新是會持有b樹的index lock, 第二個事務會一直等待index lock直至第乙個事務提交完成。rdb_transaction*tx,
rocksdb::columnfamilyhandle*column_family,
const rocksdb::slice&key,
std::
string* value) const
return
s;}
myrocks目前只支援一種鎖型別:排他鎖(x鎖),並且所有的鎖資訊都儲存在記憶體中。
struct每個鎖實際是key和lockinfo的對映. 鎖資訊都儲存在map中lockinfo
struct為了減少全域性鎖資訊訪問的衝突, rocksdb將鎖資訊進行按key hash分割槽,lockmapstripe
struct同時每個column family 儲存乙個這樣的lockmap.lockmap
using lockmaps = std::unordered_map>;max_num_locks:事務鎖個數限制lockmaps lock_maps_;
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...