5.1事务
1、什么是事务?一些sql语句序列的集合,是多条sql,要作为一个整体来执行,要么全部成功,要么全部失败。
mysql执行事务:
beginTransaction//开始事务
insert into student ....;
select * from student ......
endTransaction//事务结束
2、什么时候需要使用事务?
一个操作需要多条(2条或者2条以上的sql),sql语句一起完成,操作才能完成。
5.2 在程序中事务在哪里说明
加载业务类的方法上面(public方法上面),表示业务放大执行时,需要事务的支持。
5.3 事务管理器
5.3.1不同的数据库访问技术,处理事务的方式是不同的
1)使用jdbc访问数据库,事务处理
public void Account(){
Connecton con = ..
con.setAutoCommit(false);
stat.insert();
stat.update;
con.commit();
con.setAutoCommit(true);
}
2)mybatis执行数据库操作,处理事务
public void updateAccount(){
SqlSession session = SqlSession.openSession(false);
try{
session.insert("insert into ...");
session.update("update ...");
session.commit();
}catch(Exception e){
session.rollback():
}
}
5.3.2 spring统一事务管理事务,把不同的数据库访问技术的事务处理统一起来
使用spring的事务管理器,管理不同的数据库访问技术的事务处理,开发人员只需要掌握spring的事务处理一个方案,就可以实现使用不同的数据库访问技术的事务管理。
管理事务面向的是spring,有spring管理事务,做事务的提交,事务的回滚。
5.3.3 Spring事务管理器
Spring框架使用事务管理器来管理事务,
事务管理器接口:PlatFormTransactionManager
作用:定义了事务的操作,主要是commit(),rollback()
事务管理器有很多实现类:一种数据库的访问技术有一个实现类,由实现类具体完成事务的提交、回滚
意味着:jdbc或者mybatis访问数据库有自己的事务管理器实现类:DATASourceTransactionManager
hibernate框架,他的事务管理器实现类:HibernateTransactionManager
事务管理器的工作方式:
5.3.4 事务的提交和回滚时机
什么时候提交、回滚事务?
当业务方法正常执行时,没有异常,事务自动提交。如果业务方法抛出了运行时异常,事务是回滚的。
异常的分类:
Error:严重错误,回滚
Exception:异常类,可以处理的异常情况
1、运行时异常:RuntimeException和他的子类都是运行时异常,在程序执行过程中抛出的异常。常见的运行时异常:NullPointException,NumberFormatException,IndexBoundException.......
2、受查异常:在编写java代码的时候,必须要处理的异常,例如:IOException,SQLException,FileNotFoundException....,受查异常默认是提交事务
总结
方法中抛出了运行时异常,回滚;其他情况(正常执行方法、受查异常)就提交事务
5.3.5 事务使用的AOP的环绕通知
环绕通知:在目标方法的前和后都能增强功能,不需要修改代码。
//spring给业务方法在执行时,增加上事务的切面方法
@Around("execution( 所有的业务方法类中的方法)")
public Object myAround(ProceedingJointPoint pjp){
try{
PlatformTransactionManager.beginTransaction()//使用spring的事务管理器去开启事务
pjp.proceed();//执行目标方法
PlatformTransactionManager.commit();//业务方法正常执行,提交事务
}catch(Exception e ){
PlatformTransactionManager.rollback();//回滚
}
}
5.4 事务定义接口TransactionDefinition
该接口定义了三类常量,定义了有关事务控制的属性
事务的属性:
1、隔离级别
2、传播行为
3、事务的超时
给业务方法说明事务的属性和ACID不一样
5.4.1 隔离级别
控制事务之间影响程度的,有5个值,但实际只有4个隔离级别
1、default:采用DB默认的事务隔离级别。MySql的默认为repeatable_read,orcal的默认为:read_committed
2、read_uncommitted:读未提交。未解决任何并发问题
3、read_committed:读已提交。解决脏读、存在不可重复读与幻读
4、repeatable_read:可重复读,解决脏读、不可重复读、存在幻读
5、serializable:串行化,不存在并发问题(事务安全性最高,但是效率最低)
5.4.2 事务的超时时间
事务的超时时间是以秒为单位的,默认为-1。该时间是表示一个业务方法最长的执行时间。到达时间没有执行完毕,spring回滚事务。-1表示没有时间限制。
5.4.3传播行为
传播行为有7个值
传播行为:业务方法在调用时,事务在方法之间的传递和使用
使用传播行为,标志方法有无事务
1、propagation_required:Spring默认的传播行为,方法在调用的时候,如果存在事务,则使用当前的事务,如果没有事务,则新建事务,方法在新建事务中执行
2、propagation_supports:有事务可以执行,没有事务也可以执行(比如:查询操作)
3、propgation_required_new:方法需要一个新事务。如果在调用方法时,则原来的事务暂停,知道新事务执行完毕。如果方法调用时,没有事务,则新建一个事务,在新事务中执行代码。
5.5 Spring框架使用自己的注解Transactional控制事务
@Transactional注解,使用注解的属性来控制事务(隔离级别、传播行为、超时)
- 属性:
1、prooagation:事务的传播行为,他使用的是propagation类的枚举值。例如:propagation.required
2、isolation:表示隔离级别,使用isolation类的枚举值,表示隔离级别
3、readOnly:boolean类型的值,表示数据库操作是不只读的,默认是false。
4、timeout:事务的超时时间,默认-1,整数值,单位是秒。例如timeout=20
5、rollbackFor:回滚的异常类列表,他的值是一个数组,每个值是异常类的class。
6、rollbackForClassName:表示回滚的异常类列表,他的值是异常类名称,是String类型的值
7、noRollbackFor:指定不需要回滚的异常类,是class类型的
8、noRollBackForClassName:不需要回滚的异常类列表,是String类型的 - 位置
1、在业务方法的上面,是在public方法的上面
2、在类的方法 - 注解的使用步骤
1、在spring的配置文件中,声明事务的内容
A、声明事务管理器,说明使用哪个事务管理器对象
B、声明使用注解管理事务(开启事务注解驱动)
2、在类的源代码中,加入@Transactional
事务的控制模式:
1、编程式,在代码中编程控制事务
2、声明式事务,不用编码
@Transactional 使用的特点:
1、spring框架自己提供的事务控制
2、适合中小型项目
3、使用方便效率高
5.6 使用AspectJ框架
使用aspectj的aop,声明食物控制叫做声明式事务
使用步骤:
1、在pom文件中加入spring-aspects的依赖
2、在spring的配置文件中声明事务的内容
A、声明事务管理器
B、声明业务方法需要的事务属性
C、声明切入点表达式
声明式事务的优缺点
1、缺点:理解难,配置复杂
2、优点:代码和事务是分开配置的,控制事务源代码不需要修改
能快速了解和掌控项目的全部事务,适合大型项目。