事务处理之二(编程中的事宜)
事务处理之二(编程中的事务)
这篇文章主要介绍在我们开发过程中怎么处理事务,当然编程语言仅限java.
文章内容会从不使用任何框架直接用jdbc怎么处理事务,到使用mybatis,hibernate逐一讲解。
一、JDBC事务。
JDBC事务是通过Connection对象来完成事务的,主要的逻辑如下
//得到Connection对象后,设置不自动提交 conn.setAutoCommit(false); //手动提交 conn.commit(); //事务的回滚 conn.rollback();
二、mybatis事务
下面的内容来自文档
http://mybatis.github.io/mybatis-3/configuration.html#environments
Mybatis支持两种类型的事务JDBC|MANAGED,我们可以在下面的内容中设置
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="..." value="..."/> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
注意到transaction中有个property的属性,这个属性主要用途在于在type=MANAGED的时候
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
因为默认情况下连接会关闭,但是有些容器不希望关闭,它们可能还会用到容器做一些其它的事情,所以可以通过这个属性来控制。
使用有以下几个步骤
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream(file)); SqlSession session = sqlSessionFactory.openSession(false); //设置不自动提交 try { BlogMapper mapper = session.getMapper(BlogMapper.class); mapper.updateBlog(blog); mapper.increaseOperation(); session.commit(); //手动提交 }catch(Exception e){ e.printStackTrace(); session.rollback(); //回滚 } finally { session.close(); }
仔细一对比发现基本一样嘛,其实框架用的也是基本的api,所以无论在任何时候都需要重视基础知识。
三、hibernate事务