数据库事务

  • 什么是事务?

保证业务操作完整性的一种数据库机制

  • 事务的四个特点:

ACID
A:原子性
C:一致性
I: 隔离性
D:持久性

  • 事务的控制
  • JDBC的控制方式:
  1. 开启事务:Connection.setAutoCommit(false);
  2. 提交事务:Connection.commit();
  3. 回滚事务:Connection.rollback();
  • Mybatis的控制方式
  1. Mybatis自动开启事务
  2. 提交事务:sqlSession.commit();
  3. 回滚事务:sqlSession.rollback();
    注意:控制事务的底层,都是Connection对象来完成
  • Spring的控制事务方式
    spring是通过aop来进行事务开发的
    1. 原始对象

service是原始对象--> 原始方法--> 核心功能(业务处理+DAO调用)
Dao作为service的成员变量,依赖注入的方式进行赋值的

private BooksMapper bookMapper;

 public void setBookMapper(BooksMapper bookMapper) {
  this.bookMapper = bookMapper;
 }

 public int addBooks(Books book) {
  return bookMapper.addBooks(book);
}
    1. 额外功能
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>
    1. 切入点
      在类或者方法上加入注解@Transactional
      事务的额外方法加给那些业务方法
    1. 组装切面
  1. 切入点:
  2. 额外功能
<tx:annotation-driven transaction-manager="transactionManager"/>
  • 事务的属性

描述事务特征的一系列值

  1. 隔离属性
  2. 传播属性
  3. 只读属性
  4. 超时属性
  5. 异常属性
  • 隔离属性:
  • 脏读的图解
    在这里插入图片描述
  • 不可重复读的图解
    在这里插入图片描述
  • 幻读的图解
    在这里插入图片描述
  • 四个隔离属性的图解
    在这里插入图片描述
  • 事务传播性的来由
    在这里插入图片描述
  • 因为多个事务组合在一块,有时候会出现错误现象,所以才会有事务的传播出现
  • 有七个传播行为
  1. required
    在这里插入图片描述

  2. 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及其子类,采用提交策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值