栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

再看Spring事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

再看Spring事务

1. 事务

数据库操作的最基本单元,逻辑上的一组操作,要么都成功,如果一个操作失败那么这组操作都会失败。

1.1 事务的四个特性(ACID)
  1. 原子性:操作不可分割,要么都成功,要不都失败;
  2. 一致性:操作前后的总量是不变的;
  3. 隔离性:同时操作同一条数据不会互相影响;
  4. 持久性:修改表中数据。
1.2 环境搭建

这里以银行转账为例子来展示Spring事务。
包含两个核心业务,即转款和收款。

  • Sql:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `money` int(20) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'lucy', 200);
INSERT INTO `t_user` VALUES (2, 'mary', 200);

SET FOREIGN_KEY_CHECKS = 1;

  • maven:
        
        
            org.springframework
            spring-beans
            5.2.8.RELEASE
        

        
            org.springframework
            spring-context
            5.2.8.RELEASE
        

        
            org.springframework
            spring-core
            5.2.8.RELEASE
        

        
            org.springframework
            spring-expression
            5.2.8.RELEASE
        

        
            commons-logging
            commons-logging
            1.2
        

        
            com.alibaba
            druid
            1.2.8
        

        
            org.springframework
            spring-aop
            5.2.8.RELEASE
        

        
            org.aspectj
            aspectjweaver
            1.9.7
        

        
            org.springframework
            spring-jdbc
            5.2.8.RELEASE
        

        
            mysql
            mysql-connector-java
            5.1.38
        

    
  • 数据库配置文件
druid.driverClass = com.mysql.jdbc.Driver
druid.url = jdbc:mysql:///spring220529?useSSL=false
druid.username = root
druid.password = root
  • bean配置文件


    

    
        
        
        
        
    

    

    
        
    

  • Dao:
public interface UserDao {

    
    boolean addMoney(Integer id, Integer money);

    
    boolean reduceMoney(Integer id, Integer money);

}

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public boolean addMoney(Integer id, Integer money) {
        String sql = "update t_user set money = money + ? where id = ?";
        return jdbcTemplate.update(sql, money, id) > 0;
    }

    @Override
    public boolean reduceMoney(Integer id, Integer money) {
        String sql = "update t_user set money = money - ? where id = ?";
        return jdbcTemplate.update(sql, money, id) > 0;
    }
}
  • Service:
public interface UserService {

    
    boolean accountMoney(Integer form, Integer to, int money);

}
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public boolean accountMoney(Integer form, Integer to, int money) {
        return userDao.reduceMoney(form,money) && userDao.addMoney(to,money);
    }
}

  • 测试类
public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("druid-bean.xml");
        UserServiceImpl userService = context.getBean("userServiceImpl", UserServiceImpl.class);
        userService.accountMoney(1,2,100);
    }
}
1.3 事务管理
  1. 一般在**业务逻辑层(服务层)**中添加事务。
  2. 分为编程式事务管理(基本不用)和声明式事务管理。
  3. 声明式事务管理可以通过注解和xml配置文件来实现,底层也是使用AOP来实现。
  4. 通过顶层PlatformTransactionManager接口对不同的数据库框架有不同的是实现:
1.4 声明式事务管理——注解
  • 配置文件中配置事务管理器:
    

        
    
  • 配置文件中开启事务管理:
    1. 修改头文件
    
    
    
    
    1. 开启事务注解
         
    
    
    1. 给service添加事务注解,添加到类上当前类的所有方法都开启事务;如果添加到方法上,只是当前方法开启事务。
    @Transactional
    public class UserServiceImpl implements UserService {
    
    

这样添加之后,Spring会抛出一个新的错误:

Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userServiceImpl' is expected to be of type 'com.jm.spring.transaction.service.Impl.UserServiceImpl' but was actually of type 'com.sun.proxy.$Proxy26'

即类型强转错误,这里直接不实现接口即可解决问题,并且实现事务的回滚。

public class UserServiceImpl
1.5 事务参数
  • propagation,事务传播行为:多事务方法(增、删、改)互相调用,针对事务进行管理的过程。
    分为以下七种:
  • ioslation,事务隔离级别:事务有隔离性,多事务之间操作不会产生影响。
    不存在隔离性造成的三个问题:
    1. 脏读:一个未提交的事务读取到另一个未提交事务数据;
    2. 不可重复读:一个未提交的事务读取到另一个提交事务修改的数据;
    3. 幻读:一个未提交事务读取到另一个提交事务添加的数据。

设置隔离级别参数:

  • timeout,超时时间:如果在该时间内事务未提交成功,就进行回滚操作。默认**-1**,单位是秒。
  • readOnly,是否只读:默认false,即可以进行任何操作,如果设置true,就只能进行查询。
  • rollbackFor,回滚:设置出现某个异常进行回滚;
  • noRollbackFor,不回滚:设置出现某个异常不进行回滚。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936353.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号