ACID 事物

KitDB的事物是ACID事物。

隔离级别和传播性

隔离级别

KitDB的隔离级别为Read Committed(读已提交)。KitDB未实现其他级别事物。

传播性

KitDB的事物传播性为PROPAGATION_REQUIRED:如果没有,就新建一个事务;如果有,就加入当前事务。KitDB未实现其他传播性。

事务-线程绑定

为了降低事物的使用复杂度,类似于Spring的食物管理方式,KitDB实现了事物和当前线程绑定。

单个事物的生命周期只能限制在本线程中。

使用事物

建立事物型KitDB

普通类型KitDB不支持事物,必须建立专门的事物型KitDB

  1. DB db = DB.buildTransactionDB("/data/kitdb/",true);

使用事物

  1. // 启动一个事物KitDB实例
  2. DB db = DB.buildTransactionDB("/data/kitdb/",true);
  3. ZSet zSet = db.getzSet();
  4. RMap rmap = db.getMap();
  5. try {
  6. //开启事物,获取事物等待最长时间5000毫秒
  7. db.startTran(5000);
  8. //操作ZSet
  9. zSet.add("test","hello world".getBytes(),System.currentTimeMillis());
  10. //操作Map
  11. rmap.put("test","hello","world".getBytes());
  12. //提交事物
  13. db.commitTX();
  14. } catch (Exception e) {
  15. //事物回滚
  16. db.rollbackTX();
  17. }

事物必须被提交或回滚!!!尽量减少事物的执行时间

事物中的禁止操作

Collection的delete方法

事物中无法调用delete直接删除整个 Collection。但可以调用fastDelete,删除这个Collection。其他Collection内元素的删除和移除操作不受影响

K-V的delPrefix方法

事物中无法调用K-V的delPrefix方法。如果需要,只能在事物外调用,或者使用其他方式实现。

死锁

在并行的多个事物中,必须小心死锁。KitDB并没有死锁检测机制,而由于key锁的机制,死锁又相对容易产生。当进行 AB BA 两个并行事物时,非常有可能产生死锁。避免死锁又多种办法:

  • 让所有操作AB的事物都按照统一顺序执行
  • 因为是KitDB是嵌入型数据库,可以通过对操作加锁的方式避免死锁

目前事物存在的问题

读性能

事物型KitDB的读性能略低于普通KitDB。如果对此问题敏感,可以使用读写分离(可见优化建议