• 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     }    
  • 相关阅读:
    vue使用laydate.js插件报错laydate.css: Invalid
    自定义css样式结合js控制audio做音乐播放器
    福利福利~262集前端免费视频!
    解决Vue在IE中报错出现不支持=>等ES6语法和“Promise”未定义等问题
    设置Chart.js默认显示Point点的值不用鼠标经过才显示
    js监听某个元素高度变化来改变父级iframe的高度
    Vue中注意target和currentTarget的使用
    VUE中让由全局变量添加生成的新数组不随全局变量的变化而变化
    bootstrap-table前端实现多条件时间段查询数据
    js小数点相乘或相除出现多位数的问题
  • 原文地址:https://www.cnblogs.com/moreforests/p/15212444.html
Copyright © 2020-2023  润新知