首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
对Spring 容器管理事务支持的总结
时间:
2016-08-20 00:06:58
阅读:
183
评论:
0
收藏:
0
[点我收藏+]
标签:
1、问题
Java代码
Connection conn =
DataSourceUtils.getConnection();
//开启事务
conn.setAutoCommit(
false);
try {
Object retVal =
callback.doInConnection(conn);
conn.commit();
//提交事务
return retVal;
}
catch (Exception e) {
conn.rollback();
//回滚事务
throw e;
}
finally {
conn.close();
}
Java代码
Session session =
null;
Transaction transaction =
null;
try {
session = factory.openSession();
//开启事务
transaction = session.beginTransaction();
transation.begin();
session.save(user);
transaction.commit();
//提交事务
}
catch (Exception e) {
e.printStackTrace();
transaction.rollback();
//回滚事务
return
false;
}
finally{
session.close();
}
缺点:不一致的事务管理,复杂 尤其当多个方法调用需要在同一个事务内时;
2、高层次解决方案
Java代码
public
interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status)
throws TransactionException;
void rollback(TransactionStatus status)
throws TransactionException;
}
Java代码
//1.获取事务管理器
PlatformTransactionManager txManager = (PlatformTransactionManager)
ctx.getBean(
"txManager");
//2.定义事务属性
DefaultTransactionDefinition td =
new DefaultTransactionDefinition();
td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
//3开启事务,得到事务状态
TransactionStatus status = txManager.getTransaction(td);
try {
//4.执行数据库操作
System.out.println(jdbcTempate.queryForInt(
"select count(*) from tbl_doc"));
//5、提交事务
txManager.commit(status);
}
catch (Exception e) {
//6、回滚事务
txManager.rollback(status);
}
重复代码太多,而且必须手工开启/释放(提交/回滚)事务。
3、高层次模板解决方案
Java代码
//1.获取事务管理器
PlatformTransactionManager txManager = (PlatformTransactionManager)
ctx.getBean(
"txManager");
//2、定义事务管理的模板
TransactionTemplate transactionTemplate =
new TransactionTemplate(txManager);
//3.定义事务属性
transactionTemplate.
setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
//4.回调,执行真正的数据库操作,如果需要返回值需要在回调里返回
transactionTemplate.execute(
new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
//5.执行数据库操作
System.out.println(jdbcTempate.queryForInt(
"select count(*) from tbl_doc"));
return
null;
}
});
需要写模板代码,我们知道事务其实是一个切面,因此我们通过AOP来解决
4、AOP解决方案——一种声明时事务方案
nSpring框架提供了一致的事务管理抽象,这带来了以下好处:
1:为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO
2:支持声明式事务管理
3:提供比复杂的事务API(诸如JTA)更简单的、更易于使用的编程式事务管理API
4:非常好地整合Spring的各种数据访问抽象
实施事务的步骤
1、定义(资源)DataSource/SessionFactory……
2、定义事务管理器(管理资源的事务)
3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性
4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象(一定是业务逻辑层)
5、Spring织入事务通知到目标对象(AOP代理)
对Spring 容器管理事务支持的总结
标签:
原文地址:http://www.cnblogs.com/doudouxiaoye/p/5789294.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!