mybatis

mybatis-3.4.6 事务管理

2020-07-25  本文已影响0人  晴天哥_王志

系列

开篇

Class.forName("com.mysql.jdbc.Driver");

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123");
conn.setAutoCommit(false);
PreparedStatement pstm = conn.prepareStatement("insert into students(name, email) values(?, ?)",
Statement.RETURN_GENERATED_KEYS);

pstm.setString(1, "name1");
pstm.setString(2, "email1");
pstm.addBatch();
pstm.executeBatch();

// 返回自增主键值
ResultSet rs = pstm.getGeneratedKeys();
while (rs.next()) {
        Object value = rs.getObject(1);
        System.out.println(value);
    }
// 执行JDBC的commit操作
conn.commit();

rs.close();
pstm.close();
conn.close();

demo

public class MybatisHelloWorld {

    public static void main(String[] args) {

        String resouce = "configuration.xml";
        Reader reader;
        try {
            reader = Resources.getResourceAsReader(resouce);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

            SqlSession sqlSession = sqlSessionFactory.openSession();
            try {
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                ImcUser imcUser = new ImcUser();
                imcUser.setUserNick("demo");
                List<ImcUser> imcUserList = new ArrayList<>();
                imcUserList.add(imcUser);
                // 执行SQL操作
                userMapper.bachAddUser(imcUserList);
                // 提交事务操作
                sqlSession.commit();
            } finally {
                sqlSession.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

commit流程分析

事务提交流程
public class DefaultSqlSession implements SqlSession {

  public void commit(boolean force) {
    try {
      executor.commit(isCommitOrRollbackRequired(force));
      dirty = false;
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error committing transaction.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

  private boolean isCommitOrRollbackRequired(boolean force) {
    return (!autoCommit && dirty) || force;
  }
}
public class DefaultSqlSession implements SqlSession {

  @Override
  public int insert(String statement, Object parameter) {
    return update(statement, parameter);
  }

  @Override
  public int update(String statement) {
    return update(statement, null);
  }

  @Override
  public int update(String statement, Object parameter) {
    try {
      dirty = true;
      MappedStatement ms = configuration.getMappedStatement(statement);
      return executor.update(ms, wrapCollection(parameter));
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }
}

close操作回滚

public class DefaultSqlSession implements SqlSession {

  @Override
  public void close() {
    try {
      executor.close(isCommitOrRollbackRequired(false));
      closeCursors();
      dirty = false;
    } finally {
      ErrorContext.instance().reset();
    }
  }
public abstract class BaseExecutor implements Executor {

    public void close(boolean forceRollback) {
    try {
      try {
        // 执行回滚操作,根据forceRollback来执行
        rollback(forceRollback);
      } finally {
        if (transaction != null) {
          transaction.close();
        }
      }
    } catch (SQLException e) {
    } finally {
    }
  }

  public void rollback(boolean required) throws SQLException {
    if (!closed) {
      try {
        clearLocalCache();
        flushStatements(true);
      } finally {
        if (required) {
          // 执行回滚
          transaction.rollback();
        }
      }
    }
  }
}

结论

参考文章

上一篇下一篇

猜你喜欢

热点阅读