事务操作

45 阅读2分钟

事务概念

  • 什么是事务
    (1)事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,如果有一个失败所有操作都失败。
    (2)典型场景:银行转账
    举例:lucy给mary转账100元
    lucy少一百,mary多一百

  • 事务有四个特性(ACID特性)

  • 原子性:

  • 一致性

  • 隔离性

  • 持久性

事务操作(搭建事务操作环境)

1、创建数据库表,添加记录
1677143967585.png

2、创建service,搭dao,完成对象的创建和注入关系
(1)在service中注入dao,在dao中注入JdbcTemplate,在JdbcTemplate中注入DataSource

@Service
public class UserService {
    // 注入dao
    @Autowired
    private UserDao userDao;
}
@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
}

3、在dao中创建两个方法:多钱和少钱,在service中创建一个转账的方法

// 多钱
@Override
public void addMoney() {
    String sql = "update t_account set money=money+? where username=?";
    jdbcTemplate.update(sql,100,"mary");
}

// lucy转账100给mary
// 少钱
@Override
public void reduceMoney() {
    String sql = "update t_account set money=money-? where username=?";
    jdbcTemplate.update(sql,100,"lucy");
}
@Service
public class UserService {
    // 注入dao
    @Autowired
    private UserDao userDao;

    // 转账的操作
    public void accountMoney(){
        // lucy少一百
        userDao.reduceMoney();
        // mary多一百
        userDao.addMoney();
        
    }
}
public class TestBook {
     @Test
    public void testAccount(){
         ApplicationContext context =
                 new ClassPathXmlApplicationContext("bean1.xml");
         UserService userService = context.getBean("userService", UserService.class);
         userService.accountMoney();
     }
    }

操作结果:

1677160314124.png

4、上面代码,如果正常执行没有问题,但是如果代码执行过程中出现异常,结果就有问题

    // 转账的操作
    public void accountMoney() {
        // lucy少一百
        userDao.reduceMoney();

        // 模拟异常
        int i =10/0;

        // mary多一百
        userDao.addMoney();
    }
}

出现只少钱不多钱的情况:

1677160755879.png

上述问题应该怎样解决?

  • 使用事务进行解决
   // 转账的操作
    public void accountMoney() {
        try {
                // 第一步:开始事务
                // 第二步:进行业务操作
                // lucy少一百
                userDao.reduceMoney();

                // 模拟异常
                int i =10/0;

                // mary多一百
                userDao.addMoney();

                // 第三步 没有发生异常,提交事务
        }catch (Exception e){
                // 第四步 出现异常,事务回滚
        }
    }
}