ACID 事物
KitDB的事物是ACID事物。
隔离级别和传播性
隔离级别
KitDB的隔离级别为Read Committed(读已提交)。KitDB未实现其他级别事物。
传播性
KitDB的事物传播性为PROPAGATION_REQUIRED:如果没有,就新建一个事务;如果有,就加入当前事务。KitDB未实现其他传播性。
事务-线程绑定
为了降低事物的使用复杂度,类似于Spring的食物管理方式,KitDB实现了事物和当前线程绑定。
单个事物的生命周期只能限制在本线程中。
使用事物
建立事物型KitDB
普通类型KitDB不支持事物,必须建立专门的事物型KitDB
DB db = DB.buildTransactionDB("/data/kitdb/",true);
使用事物
// 启动一个事物KitDB实例
DB db = DB.buildTransactionDB("/data/kitdb/",true);
ZSet zSet = db.getzSet();
RMap rmap = db.getMap();
try {
//开启事物,获取事物等待最长时间5000毫秒
db.startTran(5000);
//操作ZSet
zSet.add("test","hello world".getBytes(),System.currentTimeMillis());
//操作Map
rmap.put("test","hello","world".getBytes());
//提交事物
db.commitTX();
} catch (Exception e) {
//事物回滚
db.rollbackTX();
}
事物必须被提交或回滚!!!尽量减少事物的执行时间
事物中的禁止操作
Collection的delete方法
事物中无法调用delete直接删除整个 Collection。但可以调用fastDelete,删除这个Collection。其他Collection内元素的删除和移除操作不受影响
K-V的delPrefix方法
事物中无法调用K-V的delPrefix方法。如果需要,只能在事物外调用,或者使用其他方式实现。
死锁
在并行的多个事物中,必须小心死锁。KitDB并没有死锁检测机制,而由于key锁的机制,死锁又相对容易产生。当进行 AB BA 两个并行事物时,非常有可能产生死锁。避免死锁又多种办法:
- 让所有操作AB的事物都按照统一顺序执行
- 因为是KitDB是嵌入型数据库,可以通过对操作加锁的方式避免死锁
目前事物存在的问题
读性能
事物型KitDB的读性能略低于普通KitDB。如果对此问题敏感,可以使用读写分离(可见优化建议)