Spring 事务

Pom.xml 

数据库使用mysql,连接池使用c3p0


        <!-- 添加c3p0 dataSource 连接池 -->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <!-- mysql的数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <!-- spring的数据库jdbc连接 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>

数据库相关配置

DataSource

使用连接池 连接 数据库,则许向Spring容器中注入DataSource

    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        //c3p0提供的数据库连接池的实现类
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("root");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        return dataSource;
    }

JdbcTemplate

使用spring提供的JdbcTemplate来操作数据库,则许向Spring容器中注入JdbcTemplate

    @Bean
    public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
        return new JdbcTemplate(dataSource());
    }

事务的相关配置

@Transactional

@Transactional可以添加在 类 或者 方法上, 如果想让事务生效必须启用事务管理器(@EnableTransactionManagement)
@Service
public class PersonService {
    @Autowired
    private PersonDao personDao;

    @Transactional
    public void insert(){
        personDao.insert();
        System.out.println("插入完成..................");
        int a = 1/0;
    }
}

@EnableTransactionManagement

启用事务管理器,只有表明了此注解,事务才可以生效

@Configuration
@ComponentScan(value = {"com.lb.spring.day6.part19"})
@EnableTransactionManagement
public class MyConfigration19 {
}

PlatformTransactionManager接口

当在代码中只使用了注解@EnableTransactionManagement 和 @Transactional时,会报错缺少PlatformTransactionManager

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available

	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:347)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:394)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:284)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
	at com.lb.spring.day6.part19.service.PersonService$$EnhancerBySpringCGLIB$$dc956731.insert(<generated>)
	at day6.Part19Test.test(Part19Test.java:13)

则必须需要配置事务管理器

//注册事务管理器
	@Bean
	public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException{
		return new DataSourceTransactionManager(dataSource());
	}

通过配置以下三项,则事务即可生效

  •  @EnableTransactionManagement
  •  @Transactional
  • PlatformTransactionManager

Demo:

执行前:

@Configuration
@ComponentScan(value = {"com.lb.spring.day6.part19"})
@EnableTransactionManagement
public class MyConfigration19 {
    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        //c3p0提供的数据库连接池的实现类
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("root");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
        return new JdbcTemplate(dataSource());
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws PropertyVetoException {
        return new DataSourceTransactionManager(dataSource());
    }
}

@Repository
public class PersonDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void insert(){
        String sql = "insert into person_test(name,birthday) values(?,?)";
        jdbcTemplate.update(sql,"lb",new Date());
    }
}

@Service
public class PersonService {
    @Autowired
    private PersonDao personDao;

    @Transactional
    public void insert(){
        personDao.insert();
        System.out.println("插入完成..................");
        int a = 1/0;
    }
}

public class Part19Test {
    @Test
    public void test() throws Exception {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfigration19.class);
        PersonService personService = app.getBean(PersonService.class);
        personService.insert();
        app.close();
    }
}

结果:因为事务中报错,则rollback未插入成功

插入完成..................



java.lang.ArithmeticException: / by zero

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值