ibatis 事务

sqlMap = xmlBuilder.buildSqlMap(reader);
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(0));
sqlMap.update("User.updateUser", user);
 
User user2 = new User();
user2.setId(new Integer(2));
user2.setName("Kevin");
user2.setSex(new Integer(1));
sqlMap.update("User.updateUser", user2);

 

在执行sqlMap.update的时候,ibatis会自动判定当前的运行环境,这里 update操作并没有相对应的事务范围(startTransaction和endTransaction代码块),于是ibatis 将其作为一个单独的事务,并自动提交。对于上面的代码,update 执行了两次,与其相对应,事务也提交了两次(即每个 update操作为一个单独的事务)。
 
不过,值得注意的是,这里的所谓“自动判定”,可能有些误导,ibatis 并没有去检查当前是否已经有事务开启,从而判断当前数据库连接是否设定为自动提交。 实际上,在执行update语句时,sqlMap会检查当前的Session是否已经关联了某个数据库连接,如果没有,则取一个数据库连接,将其AutoCommit属性设为 true,然后执行 update 操作,执行完之后又将这个连接释放。这样,上面两次 update 操作实际上先后获取了两个数据库连接,而不是我们通常所认为的两次 update 操作都基于同一个JDBC Connection。这点在开发时需特别注意。

对 于 多条 SQL 组合 而 成 的一 个 JDBC 事 务 操 作 而 言, 必须 使 用startTransaction、commit和endTransaction 操作以实现整体事务的原子性。

你可能感兴趣的:(sql,ibatis,jdbc)