NutTxDao简介

Sep 23, 2017 11:04:42 PM

NutTxDao的由来

先看看Trans的优缺点

  • 自动事务管理, 一个内部类完全隔离事务实现, 能有效确保事务的完整性,而且很直观.
  • 不支持嵌套事务
  • 手动控制事务比较麻烦
  1. Trans.exec( () -> {
  2. dao.update(user);
  3. dao.update(role);
  4. });

NutTxDao试图解决:

  • 嵌套事务及手动控制事务,以增强事务的可控性
  • 借助JDK7+的try-with-resource语法,协助用户确保事务的完整性
  1. try (NutTxDao tx = new NutTxDao(dao);) {
  2. tx.beginRC();
  3. tx.update(user);
  4. tx.update(role);
  5. tx.commit();
  6. } catch (Throwable e) {
  7. tx.rollback();
  8. log.debug("tx fail", e);
  9. } finally {
  10. tx.close();
  11. }

用法

NutTxDao 是NutDao的子类,通过复制NutDao的内部状态,并设置DaoRunner实例, 改变原有的事务控制逻辑

一般写法

  1. // 通过NutDao实例构建一下NutTxDao
  2. NutTxDao tx = new NutTxDao(dao);
  3. try {
  4. // 开启事务, tx.beginRC()开启事务级别为Connection.READ_COMMITTED. 是 tx.begin(Connection.READ_COMMITTED); 的缩写.
  5. tx.beginRC();
  6. tx.update(user);
  7. tx.update(role);
  8. // 提交事务
  9. tx.commit();
  10. } catch (Throwable e) {
  11. // 回滚事务
  12. tx.rollback();
  13. log.debug("tx fail", e);
  14. } finally {
  15. // 关闭事务
  16. tx.close();
  17. }

结合JDK7+语法

  1. // 通过NutDao实例构建一下NutTxDao
  2. try (NutTxDao tx = new NutTxDao(dao);) {
  3. // 开启事务, tx.beginRC()开启事务级别为Connection.READ_COMMITTED. 是 tx.begin(Connection.READ_COMMITTED); 的缩写.
  4. tx.beginRC();
  5. tx.update(user);
  6. tx.update(role);
  7. // 提交事务
  8. tx.commit();
  9. } catch (Throwable e) {
  10. // 回滚事务
  11. tx.rollback();
  12. log.debug("tx fail", e);
  13. }

多线程环境

NutTxDao的beginX/commit/rollback/close不是线程安全的.

NutTxDao应该以局部变量的形式出现在代码中,而不应该是实例属性或静态属性.

创建NutTxDao自身的成本很低,相对于数据库事务来说微乎其微.

交叉事务

NutTxDao的事务仅依赖于实例本身,与Trans无关,也与其他NutTxDao实例无关.

所以, 你可以同时开始多个事务, 然后按需要调用commit或rollback

  1. NutTxDao tx1 = new NutTxDao(dao);
  2. NutTxDao tx2 = new NutTxDao(dao);
  3. NutTxDao tx3 = new NutTxDao(dao);
  4. try {
  5. tx1.beiginRC();
  6. tx2.beiginRC();
  7. // 中间嵌套一个独立的事务3
  8. tx3.beiginRC();
  9. tx3.commit();
  10. tx1.commit();
  11. tx2.commit();
  12. } catch (Throwable e) {
  13. tx1.rollback();
  14. tx2.rollback();
  15. tx3.rollback();
  16. }

调试开关

若对一个NutTxDao的事务行为有疑惑,可以开启其debug开关

  1. NutTxDao tx1 = new NutTxDao(dao).setDebug(true);

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/dao/trans_session.html