这篇文章主要介绍在我们开发过程中怎么处理事务,当然编程语言仅限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,所以无论在任何时候都需要重视基础知识。
想知道mybatis是如何实现事务管理的,点MyBatis事务管理源码
三、hibernate事务
//TODO