一、事务:
1、 四大特性:【ACID】
① 原子性(atomicity):不可分割,表现为一个事务中涉及到的多个操作在逻辑上缺一不可,要求事务中的所有操作要么都执行,要么都不执行
② 一致性(consistency):数据一致,所有数据都处于满足业务规则的一致性状态。一个事务不管涉及到多少个操作,都必须保证事务执行前后数据都是正确的;如果有一个或某几个操作失败了,则必须将其他所有的操作撤销,将数据恢复到事务执行前的状态,也就是说回滚
③ 隔离性(isolation):要求多个事务在并发执行过程中不会相互干扰
④ 持久性(durability):事务执行完成后,对数据的修改永久的保存下来,被写入到持久化存储器中不会因各种系统错误或其他意外情况而受到影响
2、三种行为:
① 开启事务:connection.setAutoCommit(flase)
② 提交事务:connection.commit()
③ 回滚事务:connection.rollback()
3、 编程式事务管理:
1) 获取数据库连接Connection对象
2) 取消事务的自动提交
3) 执行操作
4) 正常完成操作时手动提交事务
5) 执行失败时回滚事务
6) 关闭相关资源
总结:编程式事务管理不足,将事务管理代码【非业务代码】与业务代码书写一处,导致代码混乱和代码分散问题。
此时:需要使用AOP思想【先横向提取,再动态织入】,管理事务:声明式事务管理
4、声明式事务管理:
1)导入相关jar包
spring-aspects-5.3.1.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar <依赖上jar包>
2)开启声明式事务管理支持
3)在需要事务管理的方法或类上,添加@Transactional
5、不使用事务管理问题
案例:以买书为例
/**
* 买书->查询book价格->修改库存->修改余额
* @param userId
* @param isbn
*/
public void purchase(String userId, String isbn) {
//1.查询book价格
Integer price = bookShopDao.getBookPriceByIsbn(isbn);
//2.修改库存
bookShopDao.updateBookStock(isbn);
//3.修改余额
bookShopDao.updateUserBalance(userId,price);
}
@Test
public void testBookShopService(){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext_transaction.xml");
BookShopServiceImpl bookShopSe