Spring管理事务方式
1.JDBC编程事务管理:可以清楚的控制事务的边界,事务控制粒度细化(编程的方式)
2.JDBC声明事务管理:事务相关API不用介入程序之中,将事务管理与实际业务代码解耦(配置XML的方式)
JDBC编程事务管理
1.实现PlatformTransactionManager接口
Spring配置文件
Java代码
2.使用事务模板Transactiontemplate
JDBC编程事务管理 缺点
浸入代码,改变之后需改动代码,灵活度不够
Spring 声明事务管理
1.设置person.java实体类
2.设置数据库操作接口
3.设置接口实现类(模拟循环插入多条数据)
4.修改Spring的配置文件
5.编写测试类
使用XML Schema声明事务管理
1.加入相关的XML命名空间
2.将上述配置文件中“传统方式”部分换成
3.测试类调用Bean时调用
//必须调用代理Bean
就可以了
使用注解声明事务管理
主要使用@Transactionl来标示
1.修改接口的实现类如下(加注解)
2.修改配置文件
1.JDBC编程事务管理:可以清楚的控制事务的边界,事务控制粒度细化(编程的方式)
2.JDBC声明事务管理:事务相关API不用介入程序之中,将事务管理与实际业务代码解耦(配置XML的方式)
JDBC编程事务管理
1.实现PlatformTransactionManager接口
Spring配置文件
<!-- Spring编程事务管理配置 -->
<bean id="transactionmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
Java代码
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext1.xml");
//初始化事务
PlatformTransactionManager ptm = (PlatformTransactionManager) cpx.getBean("transactionmanager");
DefaultTransactionDefinition dtd = new DefaultTransactionDefinition();
dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus ts = ptm.getTransaction(dtd);
//进行事务
try{
DataSource ds=(DataSource) cpx.getBean("dataSource");
JdbcTemplate jt = new JdbcTemplate(ds);
jt.execute("insert into JDBC_TEST values(4,'张三丰')");
jt.execute("insert into JDBC_TEST values(3,'周芷若')");
ptm.commit(ts);
}catch(Exception e){
ptm.rollback(ts);
e.printStackTrace();
}
}
2.使用事务模板Transactiontemplate
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext1.xml");
//第二种使用事务模板Transactiontemplate
PlatformTransactionManager ptm = (PlatformTransactionManager) cpx.getBean("transactionmanager");
TransactionTemplate tt = new TransactionTemplate(ptm);
DataSource ds = (DataSource) cpx.getBean("dataSource");
final JdbcTemplate jt = new JdbcTemplate(ds);
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
jt.execute("insert into JDBC_TEST values(4,'张三丰')");
jt.execute("insert into JDBC_TEST values(4,'周芷若')");
}
});
}
JDBC编程事务管理 缺点
浸入代码,改变之后需改动代码,灵活度不够
Spring 声明事务管理
1.设置person.java实体类
public class Person {
private Long id;
private String name;
private int age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.设置数据库操作接口
public interface PersonDao {
public void insert(long id, String name, int age);
public void batchInsert(List persons);
}
3.设置接口实现类(模拟循环插入多条数据)
public class PersonDaoImpl implements PersonDao{
private JdbcTemplate jt;
public void setDataSource(DataSource dataSource){
this.jt = new JdbcTemplate(dataSource);
}
@Override
public void insert(long id, String name, int age) {
jt.update("insert into person values('" + id +"'," + name + "," + age + ")");
}
@Override
public void batchInsert(List persons) {
for(Iterator it = persons.iterator();it.hasNext();){
Person p = (Person) it.next();
insert(p.getId(),p.getName(),p.getAge());
}
}
}
4.修改Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:ORCL</value>
</property>
<property name="username">
<value>TEST_USER</value>
</property>
<property name="password">
<value>lixin</value>
</property>
</bean>
<bean id="personDao" class="com.pb.person.Spring.transaction.PersonDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- Spring编程事务管理配置 -->
<bean id="transactionmanager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 传统方式-->
<bean id="personDaoProxyBean"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<!-- 指定代理接口 -->
<value>com.pb.person.Spring.transaction.PersonDao</value>
</list>
</property>
<!-- 指定被代理的bean -->
<property name="target" ref="personDao" />
<!-- 注入事务管理 -->
<property name="transactionManager" ref="transactionManager"/>
<!-- 事务管理被代理Bean的具体方法以及方式 -->
<property name="transactionAttributes">
<props>
<prop key="batch*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
5.编写测试类
public static void main(String[] args) {
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext.xml");
//必须调用代理Bean
PersonDao personDao = (PersonDao) cpx.getBean("personDaoProxyBean");
Person p1 = new Person();
Person p2 = new Person();
p1.setId(23);
p1.setName("朱雀");
p1.setAge(199);
p2.setId(11);
p2.setName("玄武");
p2.setAge(150);
List persons = new ArrayList();
persons.add(p1);
persons.add(p2);
personDao.batchInsert(persons);
}
使用XML Schema声明事务管理
1.加入相关的XML命名空间
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
"
2.将上述配置文件中“传统方式”部分换成
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="batch*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="personDaoPC"
expression = "execution(* demo.spring.dao.PersonDAO.*(..))"
/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="personDaoPC" />
</aop:config>
3.测试类调用Bean时调用
//必须调用代理Bean
PersonDao personDao = (PersonDao) cpx.getBean("personDao");
就可以了
使用注解声明事务管理
主要使用@Transactionl来标示
1.修改接口的实现类如下(加注解)
@Transactional
public class PersonDaoImpl implements PersonDAO {
private JdbcTemplate jt;
public void setDataSource(DataSource dataSource){
jt = new JdbcTemplate(dataSource);
}
public void insert(long id, String name, int age) {
jt.update("insert into person values('" + name +"'," + age + "," + id + ")");
}
@Transactional(propagation = Propagation.REQUIRED)
public void batchInsert(List persons) {
for(Iterator it = persons.iterator();it.hasNext();){
Person p = (Person) it.next();
insert(p.getId(),p.getName(),p.getAge());
}
}
}
2.修改配置文件
将“传统方式”换成
<tx:annotation-driven transaction-manager="transactionManager"/>