Spring 注解版-事务实现

复制代码
/**
 *   声明式事务
 *
 *   环境搭建:
 *   1、导入相关依赖
 *          数据源、数据库驱动,spring-jdbc模块
 *   2、配置数据源,JdbcTemplate 来操作数据库
 *   3、给方法上标注 @Transactional 表示当前方法是一个事务方法
 *   4、@EnableTransactionManagement 开启基于注解的事务管理功能
 *   5、配置事务管理器来控制事务
 */
复制代码

 

1)导入相关依赖

复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>

<!-- c3p0连接池 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.2</version>
</dependency>

<!--mysql-connector mysql驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.44</version>
</dependency>
复制代码

 

2)配置数据源,JdbcTemplate 来操作数据库

复制代码
①配置类
@ComponentScan("com.atguigu.tx") //扫描加了@component的类
@Configuration  //告诉spring这是一个配置类
public class TxConfig {

    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource =new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("houchen");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");  //设置mysql的驱动
        return dataSource;
    }


    @Bean
    public JdbcTemplate jdbcTemplate() throws PropertyVetoException {

        // dataSource() : 并不是执行该方法,而是去ioc容器中查找相应的组件
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
        return  jdbcTemplate;
    }


}

② service层

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    public void InsertUser(){
        userDao.InsertUser();
        int i= 1/0;
    }
}

③dao层
@Repository
public class UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void InsertUser(){
        String sql ="INSERT INTO tb_user (username,password) values('houchen','123');";
        jdbcTemplate.update(sql);
    }
}

④ 测试下
public class IocTxTest {


    @Test
    public void test01() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(TxConfig.class);
        UserService userService = ac.getBean(UserService.class);
        userService.InsertUser();
    }

}
复制代码

 

结果如下:虽然报错了:但是数据还是插入了

1594225553(1)

clipboard

 

3、给方法上标注 @Transactional 表示当前方法是一个事务方法

复制代码
@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Transactional
    public void InsertUser(){
        userDao.InsertUser();
        int i= 1/0;
    }
}
复制代码

 

5、配置事务管理器来控制事务

复制代码
@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Transactional
    public void InsertUser(){
        userDao.InsertUser();
        int i= 1/0;
    }
}
4、@EnableTransactionManagement 开启基于注解的事务管理功能
 5、配置事务管理器来控制事务
@EnableTransactionManagement
@ComponentScan("com.atguigu.tx")
@Configuration  //告诉spring这是一个配置类
public class TxConfig {

    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource =new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("houchen");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");  //设置mysql的驱动
        return dataSource;
    }


    @Bean
    public JdbcTemplate jdbcTemplate() throws PropertyVetoException {

        // dataSource() : 并不是执行该方法,而是去ioc容器中查找相应的组件
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
        return  jdbcTemplate;
    }


    // 配置事务管理器来控制事务
    @Bean
    public PlatformTransactionManager transactionManager() throws Exception {
        return  new DataSourceTransactionManager(dataSource());
    }

}
复制代码

 

测试结果如下:

1594225798(1)

posted @   青岑  阅读(307)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
主题色彩