Spring实现MySQL事务操作

一、创建数据库表

表名:account

字段:(`id`,`username`,`money`)

二、dao、service层创建业务接口、类

1 public interface UserDao {
2     void addMoney();
3     void reduceMoney();
4 }
 1 @Repository
 2 public class UserDaoImpl implements UserDao {
 3 
 4     @Autowired
 5     private JdbcTemplate jdbcTemplate;
 6 
 7     @Override
 8     public void addMoney() {
 9         String sql = "update account set money = money + ? where username = ?";
10         jdbcTemplate.update(sql,101,"zhangsan");
11     }
12 
13     @Override
14     public void reduceMoney() {
15         String sql = "update account set money = money - ? where username = ?";
16         jdbcTemplate.update(sql,102,"lisi");
17     }
18 }

 三、注解形式实现事务管理

 1 @Service
 2 @Transactional
 3 public class UserService {
 4 
 5     @Autowired
 6     UserDao userDao;
 7 
 8     public void accountMoney() {
 9         userDao.reduceMoney();
10         // 模拟异常
11         int i = 10 / 0;
12         userDao.addMoney();
13     }
14 }

 bean.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:tx="http://www.springframework.org/schema/tx"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 7     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 8     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
 9 ">
10     <!--  数据库连接池  -->
11     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
12         <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
13         <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
14         <property name="username" value="root"></property>
15         <property name="password" value="root"></property>
16     </bean>
17     <!--  JdbcTemplate对象  -->
18     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
19         <!--注入dataSource-->
20         <property name="dataSource" ref="dataSource"></property>
21     </bean>
22     <!--  组件扫描  -->
23     <context:component-scan base-package="com.example"></context:component-scan>
24 
25     <!--  创建事务管理器  -->
26     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
27         <!--注入数据源-->
28         <property name="dataSource" ref="dataSource"></property>
29     </bean>
30     <!--  开启事务注解  -->
31     <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
32 </beans>

 四、XML配置文件实现声明式事务管理

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:tx="http://www.springframework.org/schema/tx"
 6        xmlns:aop="http://www.springframework.org/schema/aop"
 7        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 9     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
10     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
11 ">
12 
13     <!--  数据库连接池  -->
14     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
15         <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
16         <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
17         <property name="username" value="root"></property>
18         <property name="password" value="root"></property>
19     </bean>
20 
21     <!--  JdbcTemplate对象  -->
22     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
23         <!--注入dataSource-->
24         <property name="dataSource" ref="dataSource"></property>
25     </bean>
26 
27     <!--  组件扫描  -->
28     <context:component-scan base-package="com.example"></context:component-scan>
29 
30     <!--  1. 创建事务管理器  -->
31     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
32         <!--注入数据源-->
33         <property name="dataSource" ref="dataSource"></property>
34     </bean>
35 
36     <!--  2. 配置通知  -->
37     <tx:advice id="txadvice">
38         <!--     配置事务参数   -->
39         <tx:attributes>
40             <!--      指定哪种规则的方法上面添加事务      -->
41             <tx:method name="accountMoney" propagation="REQUIRED"/>
42             <!--<tx:method name="account*"/>-->
43         </tx:attributes>
44     </tx:advice>
45 
46     <!--  3. 配置切入点和切面  -->
47     <aop:config>
48         <!--    配置切入点    -->
49         <aop:pointcut id="pt" expression="execution(* com.example.demo.service.UserService.*(..))"/>
50         <!--    配置切面    -->
51         <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
52     </aop:config>
53     
54 </beans>

五、完全注解实现事务管理

使用配置类代替xml文件

dao、service 使用步骤二、三中的例子

 1 @Configuration // 配置类
 2 @ComponentScan(basePackages = "com.example") // 扫描包
 3 @EnableTransactionManagement //开启事务
 4 public class TxConfig {
 5 
 6     /**
 7      * 创建数据库连接池
 8      */
 9     @Bean
10     public DruidDataSource getDruidDataSource() {
11         DruidDataSource dataSource = new DruidDataSource();
12         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
13         dataSource.setUrl("jdbc:mysql://localhost:3306/test");
14         dataSource.setUsername("root");
15         dataSource.setPassword("root");
16         return dataSource;
17     }
18 
19     /**
20      *  创建JdbcTemplate对象
21      */
22     @Bean
23     public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
24         // 到IOC容器中根据类型找到dataSource
25         JdbcTemplate jdbcTemplate = new JdbcTemplate();
26         // 注入dataSource
27         jdbcTemplate.setDataSource(dataSource);
28         return jdbcTemplate;
29     }
30 
31     /**
32      * 创建事务管理器
33      */
34     @Bean
35     public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
36         DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
37         transactionManager.setDataSource(dataSource);
38         return transactionManager;
39     }
40 
41 }

 六、测试

使用xml配置文件实现事务管理时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件;

使用完全注解实现事务管理时使用 new AnnotationConfigApplicationContext(TxConfig.class)加载配置类。
1     @Test
2     public void accountTest2() {
3         //完全注解时的测试(加载配置类);xml配置文件测试时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件
4         ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
5         UserService userService = context.getBean("userService", UserService.class);
6         userService.accountMoney();
7     }    
posted @ 2021-08-31 22:16  一缕暖阳  阅读(518)  评论(0编辑  收藏  举报