使用声明式事务
事务类本身就是一个拦截器,可以用注解的方式配置。方法内部的所有 DML 操作都将在本次事务之内。
配置代码如下:
@Before(Tx.class) public void savePost(){ //... }
事务配置就是这么简单任性。
声明式事务实现原理
上述配置中为 savePost() 配置了事务也就是拦截器 Tx,当调用到 savePost() 的时候,是会进入到 Tx 的 intercept 方法中的:
- 建立数据库连接;
- 设置事务隔离级别;
- 设置事务手动提交;
- 反射机制调用 savePost();
- 事务提交;
- 若事务失败,就回滚。
主要代码如下:
public void intercept(Invocation inv) { Config config = getConfigWithTxConfig(inv); if (config == null) config = DbKit.getConfig(); Connection conn = config.getThreadLocalConnection(); // 下面这段支持嵌套事务,可以忽略不看 if (conn != null) { try { if (conn.getTransactionIsolation() < getTransactionLevel(config)) conn.setTransactionIsolation(getTransactionLevel(config)); inv.invoke(); return