Spring声明式事务管理(完全注解方式)

Spring声明式事务管理(完全注解方式)

  1. 创建数据表
    在这里插入图片描述

  2. 目录结构
    Spring声明式事务管理(完全注解方式)_第1张图片

  3. 配置类

    package com.sun.Spring.Dao.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import javax.sql.DataSource;
    
    @Configuration   //配置类
    //组件扫描
    @ComponentScan(basePackages ="com.sun.Spring.Dao")
    //开启事务
    @EnableTransactionManagement
    public class TxConfig {
    //    创建数据库连接池
        @Bean
        public DruidDataSource getDruidDataSource(){
            DruidDataSource dataSource=new DruidDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///数据库名");
            dataSource.setUsername("用户名");
            dataSource.setPassword("密码");
            return dataSource;     //返回值是DruidDataSource类型的
        }
    //    创建JDBCTemplate对象
        @Bean
        public JdbcTemplate getJdbcTemplate(DataSource dataSource){
    //        到ioc容器中根据类型找到dataSource对象进行注入
            JdbcTemplate jdbcTemplate=new JdbcTemplate();
            jdbcTemplate.setDataSource(dataSource);
            return jdbcTemplate;
        }
    //    配置事务管理器
        @Bean
        public DataSourceTransactionManager getdataSourceTransactionManager(DataSource dataSource){
            DataSourceTransactionManager TransactionManager=new DataSourceTransactionManager();
            TransactionManager.setDataSource(dataSource);
            return TransactionManager;
        }
    }
    
    
  4. UserDaoImpl.java 实现类

    package com.sun.Spring.Dao.Dao;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public class UserDaoImpl implements UserDao {
    //    注入JDBCTemplate模板    模板已在配置文件中配置完成
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Override
        public void addMoney() {
            String sql="update t_account set money=money+? where username=?";
            int marry = jdbcTemplate.update(sql, 100, "mary");
            System.out.println(marry);
    
        }
    
        @Override
        public void reduceMoney() {
            String sql="update t_account set money=money-? where username=?";
            int lucy = jdbcTemplate.update(sql, 100, "lucy");
            System.out.println(lucy);
        }
    
    }
    
    
  5. UserService.java 实现转账

    package com.sun.Spring.Dao.Service;
    
    import com.sun.Spring.Dao.Dao.UserDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Isolation;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    
    @Service
    public class UserService {
    //    注入Dao
        @Autowired
        private UserDao userDao;
    //    传播行为,隔离级别
        @Transactional(timeout = -1,readOnly = false ,propagation=Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
        public void setMoney(){
    //        lucy少100
                userDao.reduceMoney();
                int a=100/0;
    //        mary多一百
                userDao.addMoney();
        }
    }
    
    

    注:第一步,开启事务。第二步,进行事务操作。第三步,如果没有发生异常,提交事务;如果发生异常,事务回滚。(数据表数据不会发生变化)-----事务包含的所有操作要么全部成功,要么全部失败回滚。

  6. 测试方法

    //    完全注解开发
        @Test
        public void test2(){
            ApplicationContext context=
                    new AnnotationConfigApplicationContext(TxConfig.class);
            UserService userService = context.getBean("userService", UserService.class);
            userService.setMoney();
        }
    }
    

你可能感兴趣的:(Spring,spring,java,spring,boot)