- 什么是事务?
保证业务操作完整性的一种数据库机制
- 事务的四个特点:
ACID
A:原子性
C:一致性
I: 隔离性
D:持久性
- 事务的控制
- JDBC的控制方式:
- 开启事务:Connection.setAutoCommit(false);
- 提交事务:Connection.commit();
- 回滚事务:Connection.rollback();
- Mybatis的控制方式
- Mybatis自动开启事务
- 提交事务:sqlSession.commit();
- 回滚事务:sqlSession.rollback();
注意:控制事务的底层,都是Connection对象来完成
- Spring的控制事务方式
spring是通过aop来进行事务开发的
-
- 原始对象
service是原始对象--> 原始方法--> 核心功能(业务处理+DAO调用)
Dao作为service的成员变量,依赖注入的方式进行赋值的
private BooksMapper bookMapper; public void setBookMapper(BooksMapper bookMapper) { this.bookMapper = bookMapper; } public int addBooks(Books book) { return bookMapper.addBooks(book); }
-
- 额外功能
MethodInterceptor
public Object invoke(MethodInterceptor invocation){
try{
//原始方式开始之前开启事务
Connection.setAutoCommit(false);
Object ret=invocation.proceed()
//原始方式结束之后提交事务
Connection.commit();
}catch(Exception e){
Connection.rollback();
}
return ret
}
可以用Spring封装好的类:org.springframework.jdbc.datasource.DataSourceTransactionManager
因为他的底层是Connection,所以,需要注入DateSource
- spring中的实现方式
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
-
- 切入点
在类或者方法上加入注解@Transactional
事务的额外方法加给那些业务方法
- 切入点
-
- 组装切面
- 切入点:
- 额外功能
<tx:annotation-driven transaction-manager="transactionManager"/>
- 事务的属性
描述事务特征的一系列值
- 隔离属性
- 传播属性
- 只读属性
- 超时属性
- 异常属性
- 隔离属性:
- 脏读的图解
- 不可重复读的图解
- 幻读的图解
- 四个隔离属性的图解
- 事务传播性的来由
- 因为多个事务组合在一块,有时候会出现错误现象,所以才会有事务的传播出现
- 有七个传播行为
-
required
-
supports
-
requires-new
-
not- supported
-
never
-
mandatory
- 事务传播属性的使用
@Transactional(propagation = Propagation.SUPPORTS )
public Books queryBookById(int id) {
return bookMapper.queryBookById(id);
}
- 只读属性:只有查询的时候,将其设置为只读,
@Transactional(readOnly = true )
public Books queryBookById(int id) {
return bookMapper.queryBookById(id);
}
- 超时属性
当一个事务需要访问某一个资源的时候,发现另一个事务上了锁,正在用,可以给这个事务设置超时属性,如果超时了,就抛出异常
@Transactional(timeout=3)
public Books queryBookById(int id) {
return bookMapper.queryBookById(id);
}
- 异常属性
runtimeException及其子类,用过滤策略
对Exception及其子类,采用提交策略