什么是事务
事务:逻辑上的一组操作,组成这组操作的单元,要么全部成功,要么全部失败。
事务的特性
原子性:事务不可分割
一致性:事务执行前后数据完整性保持一致
隔离性:一个事务的执行不应该受到其他事务的干扰
持久性:一旦事务结束,数据就持久化到数据库
不考虑隔离性引发的安全性问题
读问题
脏读: 一个事务读到另一个事务未提交的数据
不可重复读:一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
虚读、幻读:一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致
写问题
丢失更新
解决读问题
设置事务隔离级别
Read uncommitted:未提交读,任何读问题都不能解决
Read committed: 已提交读,解决脏读,但是不可重复读和虚读有可能发生
Repeated read: 重复读,解决脏读和不可重复读,但是虚读有可能发生
Serializeble: 解决所有读问题
Spring中实现事务管理的两种方式
一、编程式事务管理:
将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式管理事务中,必须在每个事务操作中包含额外的事务管理代码。
二、声明式事务管理:
它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理,Spring声明式事务管理建立在AOP基础之上,是一个典型的横切关注点,通过环绕增强来实现,其原理是对方法前后进行拦截,然后在目标方法开始之前创建或加入一个事务,在执行完毕之后根据执行情况提交或回滚事务,其模型如下:
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
try {
//开启事务
return joinPoint.proceed();
//提交事务
} catch (Throwable e) {
//回滚事务
throw e;
}finally {
//释放资源
}
}
用注解方式实现声明式事务管理
1、引入aop的开发包
2、配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
3、开启注解事务
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
4、在业务层添加注解
@Transactional
public class UserService implements IUserService {
private UserDao userDao;
}