转TransactionProxyFactoryBean代理事务

简介: ...
<?xml version="1.0" encoding="GBK"?>
<!-- 指定Spring配置文件的DTD信息 -->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!-- Spring配置文件的根元素 -->
<beans>
    <!-- 定义数据源Bean,使用C3P0数据源实现 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <!-- 指定连接数据库的驱动 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <!-- 指定连接数据库的URL -->
        <property name="jdbcUrl" value="jdbc:mysql://localhost/javaee"/>
        <!-- 指定连接数据库的用户名 -->
        <property name="user" value="root"/>
        <!-- 指定连接数据库的密码 -->
        <property name="password" value="32147"/>
        <!-- 指定连接数据库连接池的最大连接数 -->
        <property name="maxPoolSize" value="40"/>
        <!-- 指定连接数据库连接池的最小连接数 -->
        <property name="minPoolSize" value="1"/>
        <!-- 指定连接数据库连接池的初始化连接数 -->
        <property name="initialPoolSize" value="1"/>
        <!-- 指定连接数据库连接池的连接的最大空闲时间 -->
        <property name="maxIdleTime" value="20"/>
    </bean>
    <!-- 配置JDBC数据源的局部事务管理器,使用DataSourceTransactionManager 类 -->
    <!-- 该类实现PlatformTransactionManager接口,是针对采用数据源连接的特定实现-->
    <bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 配置DataSourceTransactionManager时需要依注入DataSource的引用 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 配置一个业务逻辑Bean -->
    <bean id="test" class="lee.TestImpl">
        <property name="ds" ref="dataSource"/>
    </bean>
    <!-- 为业务逻辑Bean配置事务代理 -->
    <bean id="testTrans" class=
        "org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!-- 为事务代理工厂Bean注入事务管理器 -->
        <property name="transactionManager" ref="transactionManager"/> 
        <property name="target" ref="test"/>
        <!-- 指定事务属性 -->
        <property name="transactionAttributes"> 
            <props> 
                <prop key="*">PROPAGATION_REQUIRED</prop> 
            </props>
        </property>
    </bean> 
</beans>
public interface Test
{
    public void insert(String u);
}
public class TestImpl implements Test
{
	private DataSource ds;
	public void setDs(DataSource ds)
	{
		this.ds = ds;
	}
	public void insert(String u)
	{
		JdbcTemplate jt = new JdbcTemplate(ds);
		jt.execute("insert into mytable values('" + u + "')");
		//两次插入相同的数据,将违反主键约束
		jt.execute("insert into mytable values('" + u + "')");
		//如果增加事务控制,我们发现第一条记录也插不进去。
		//如果没有事务控制,则第一条记录可以被插入
	}
}

  

 

public class MainTest
{
    public static void main(String[] args) 
    {
        //创建Spring容器
        ApplicationContext ctx = new 
            ClassPathXmlApplicationContext("bean.xml");
        //获取事务代理Bean
        Test t = (Test)ctx.getBean("testTrans");
        //执行插入操作
        t.insert("bbb");
    }
}

 

相关文章
|
2月前
|
Java 数据库 Spring
Spring事务失效的场景详解
Spring事务失效的场景详解
38 0
|
7月前
|
存储 Java 数据库
Spring事务和事务传播机制
Spring事务和事务传播机制
60 0
|
7天前
|
Java 数据库连接 数据库
Spring事务简介,事务角色,事务属性
Spring事务简介,事务角色,事务属性
17 2
|
5月前
|
SQL Java 关系型数据库
Spring事务和事务传播机制(2)
Spring事务和事务传播机制(2)
38 0
Spring事务和事务传播机制(2)
|
5月前
|
Java 关系型数据库 MySQL
Spring事务和事务传播机制(1)
Spring事务和事务传播机制(1)
45 0
Spring事务和事务传播机制(1)
|
5月前
|
存储 Java 数据库连接
spring事务失效的几种情况与原因
spring事务失效的几种情况与原因
72 0
|
Java Spring
spring源码系列9:事务代理的创建(上)
spring源码系列9:事务代理的创建(上)
spring源码系列9:事务代理的创建(上)
|
XML 缓存 Java
引起Spring事务失效的可能原因
引起Spring事务失效的可能原因
199 0
|
Java 数据库连接 数据库
Spring事务监听,为什么会出现事务失效?
Spring 在 4.2 版本之后提供了@TransactionlEventListener 注解,可以很方便地在事务提交后做一些处理,但是如果使用不当,或者没有正确理解其背后的运行逻辑,很容易踩坑甚至导致线上故障。 之前工作中就遇到了一个问题,在事务监听时,做了一些事务操作,但是这个事务并没有生效。 今天我们就来深入了解一下,这个问题是怎么产生的,又该如何解决。
|
Java 数据库 Spring
Spring事务失效场景
如果@Transactional 没有特别指定,Spring 只会在遇到运行时异常RuntimeException或者error时进行回滚,而IOException等检查异常不会影响回滚。
243 0
Spring事务失效场景