事务概念
-
什么是事务
(1)事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,如果有一个失败所有操作都失败。
(2)典型场景:银行转账
举例:lucy给mary转账100元
lucy少一百,mary多一百 -
事务有四个特性(ACID特性)
-
原子性:
-
一致性
-
隔离性
-
持久性
事务操作(搭建事务操作环境)
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;
}
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();
}
}
操作结果:
4、上面代码,如果正常执行没有问题,但是如果代码执行过程中出现异常,结果就有问题
// 转账的操作
public void accountMoney() {
// lucy少一百
userDao.reduceMoney();
// 模拟异常
int i =10/0;
// mary多一百
userDao.addMoney();
}
}
出现只少钱不多钱的情况:
上述问题应该怎样解决?
- 使用事务进行解决
// 转账的操作
public void accountMoney() {
try {
// 第一步:开始事务
// 第二步:进行业务操作
// lucy少一百
userDao.reduceMoney();
// 模拟异常
int i =10/0;
// mary多一百
userDao.addMoney();
// 第三步 没有发生异常,提交事务
}catch (Exception e){
// 第四步 出现异常,事务回滚
}
}
}