【Spring学习笔记】Spring事务管理(一)
2013-08-21 14:43
375 查看
概念
JDBC编程事务管理
可以清楚的控制事务的边界,事务控制粒度化细(编程方式)JDBC声明事务管理
事务相关的API不用介入程序之中,将事务管理与实际业务代码解耦(配置XML的方式)Spring提供两种方式实现编程式的事务管理
1、实现PlatformTransactionManager接口2、使用事务模板TransactionTemplate
使用PlatformTransactionManager管理事务的大致流程
1、指定PlatformTransactionManager的实现类2、定义事务属性TransactionDefinition
3、将事务定义传送给TransactionStatus
4、将欲进行的事务用try..catch语句封起来
5、如果事务出错,调用PlatformTransactionManager的rollback方法
使用事务模板TransactionTemplate
1、需要封装一个TransactionManager2、创建事务回滚类
3、执行TransactionManager的execute方法
一、使用PlatformTransactionManager管理事务
操作步骤:1、在applicationContex.xml中添加相应的dataSource和transactionManager
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2、创建测试类PlatformTransactionManagerDemo
import javax.sql.DataSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/*
* 直接使用PlatformTransactionManager实现类进行事务管理
*/
public class PlatformTransactionManagerDemo {
public static void main(String[] args) {
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("beans.xml");
/*
* 初始化事务
*/
PlatformTransactionManager ptm = (PlatformTransactionManager) cpx.getBean("transactionManager");
DefaultTransactionDefinition dtd = new DefaultTransactionDefinition();
dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus ts = ptm.getTransaction(dtd);
/*
* 进行事务
*/
try {
DataSource dSource = (DataSource) cpx.getBean("dataSource");
JdbcTemplate jt = new JdbcTemplate(dSource);
jt.execute("insert into person values(98,'test',23)");
jt.execute("insert into person values(1,'test',33)");//违反唯一约束的测试语句
} catch (Exception e) {
// TODO: handle exception
ptm.rollback(ts);
e.printStackTrace();
}
}
}
3、测试函数,打印出相应的异常
org.springframework.dao.DuplicateKeyException: StatementCallback;
SQL [insert into person values(1,'rty',33)];
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011509);
nested exception is java.sql.SQLException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011509)
Caused by: java.sql.SQLException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011509)
【疑问是:这玩意儿不违反约束也没添加进去 orz】
【解决方法:(存有疑问的很二的方法)】加一条 jt.execute("commit");
存疑待解救!
二、使用事务模板TransactionTemplate管理事务
操作步骤:1、使用PlatformTransactionManager的源码
2、创建测试类TransactionTemplateDemo
/*
* 直接使用TransactionTemplate实现类进行事务管理
* 编程式事务管理最大的缺点:侵入代码
* 好处:细粒度化,可以针对某一行进行控制
* 当数据极度敏感是,使用编程的事务管理
*/
public class TransactionTemplateDemo {
public static void main(String[] args) {
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("beans.xml");
/*
* 初始化事务
*/
PlatformTransactionManager ptm = (PlatformTransactionManager) cpx.getBean("transactionManager");
TransactionTemplate tt = new TransactionTemplate(ptm);
DataSource dSource = (DataSource) cpx.getBean("dataSource");
final JdbcTemplate jt = new JdbcTemplate(dSource);
/*
* 进行事务
*/
tt.execute( // 使用内部类
new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
jt.execute("insert into person values(99,'test',23)");
jt.execute("insert into person values(1,'test',33)");
}
}
);
}
}
3、运行打印异常
Exception in thread "main" org.springframework.dao.DuplicateKeyException: StatementCallback;
SQL [insert into person values(98,'tyry',23)];
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011509);
nested exception is java.sql.SQLException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011509)
相关文章推荐
- 【spring学习笔记五】spring事务管理
- spring学习笔记:spring事务管理
- Spring学习笔记---7-Spring事务管理(3)
- Spring学习笔记---6-Spring事务管理(2)
- 学习Spring笔记二
- Spring入门学习笔记(2)——基于Java的配置
- 【Spring学习笔记六】-Spring MVC框架
- Spring4学习笔记-Spring4整合Struts2(基于配置文件的方式)
- Neo4j学习笔记九【Spring Data Neo4j】
- SpringMVC学习笔记(二)使用IntelliJ IDEA开发Spring MVC HelloWorld(基于Maven)
- spring学习笔记7--使用spring进行面向切面的(AOP)编程(1)注解方式实现
- SprintBoot学习笔记(2):SpringBoot跳转至页面
- Spring 学习笔记(一)
- Spring学习笔记2——高级特性
- Spring学习笔记-CustomEditorConfigurer
- Spring boot 学习笔记(三)
- 【Spring学习笔记-MVC-16】Spring MVC之重定向-解决中文乱码
- spring学习笔记(5)-springmvc
- Log4j学习笔记(2)_log4j配置示例&Spring集成log4j
- Spring学习笔记——Spring_note day01