您的位置:首页 > 编程语言 > Java开发

Spring管理事务方式

2014-05-25 16:09 387 查看
Spring管理事务方式

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:// 4000
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"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 事务