典型场景:银行转账
- lucy 转账 100 元 给 mary
- lucy 少 100,mary 多 100
搭建事务操作环境
1、创建数据库表,添加记录
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;
<!-- JdbcTemplate对象 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入dataSource--> <property name="dataSource" ref="dataSource"></property> </bean>
3、在 dao 创建两个方法:多钱和少钱的方法;在 service 创建方法(转账的方法)
@Repository public class UserDaoImpl implements UserDao { @Autowired private JdbcTemplate jdbcTemplate; //lucy转账100给mary //少钱 @Override public void reduceMoney() { String sql = "update t_account set money=money-? where username=?"; jdbcTemplate.update(sql,100,"lucy"); } //多钱 @Override public void addMoney() { String sql = "update t_account set money=money+? where username=?"; jdbcTemplate.update(sql,100,"mary"); } }
public class UserService { //注入dao @Autowired private UserDao userDao; //转账的方法 public void accountMoney() { //lucy少100 userDao.reduceMoney(); //mary多100 userDao.addMoney(); } }
4、上面代码,如果正常执行没有问题的,但是如果代码执行过程中出现异常,有问题
userDao.reduceMoney(); //模拟异常(除数不能为0 ) int i = 10/0; //mary多100 userDao.addMoney();
(1)上面问题(数学问题)如何解决呢?
使用事务进行解决
(2)事务操作过程
public class UserService { //注入dao @Autowired private UserDao userDao; //转账的方法 public void accountMoney() { try { //第一步 开启事务 //第二步 进行业务操作 //lucy少100 userDao.reduceMoney(); //模拟异常 int i = 10/0; //mary多100 userDao.addMoney(); //第三步 没有发生异常,提交事务 }catch(Exception e) { //第四步 出现异常,事务回滚 } } }