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(); } }
结果如下:虽然报错了:但是数据还是插入了
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()); } }
测试结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?