首页天道酬勤spring事务管理,如何实现Transactional注解

spring事务管理,如何实现Transactional注解

张世龙 05-06 01:14 67次浏览

通过Spring进行事务管理主要有两种方法。

编程事务:需要通过transactionManager.commit、tansactionManager.rollback等方法手动实现事务管理,与业务代码相结合,具有入侵性

声明式事务:基于AOP的面向切面,将具体业务与事务理解相结合,入侵性较低。 主要有两种实现方式,基于tx和AOP的xml配置文件方式,一种基于@Transactional标注

@Transactional注释属性:

传播:事务的传播行为。 默认值为Ptopagation.REQUIRED传播行为

1Propagation.REQUIRED :如果事务当前存在,则参与该事务;如果事务当前不存在,则创建新事务

2Propagation.SUPPORTS:如果当前事务存在,则参与该事务;如果当前事务不存在,则以非事务的方式继续执行

3Propagation.MANDATORY:加入该事务(如果当前存在事务); 如果事务当前不存在,则抛出异常

4Propagation.REQUIRES_NEW:重新创建新事务,并暂停当前事务(如果当前事务存在)

5 propagation.not _ supported :作为非事务执行,如果当前有事务,则暂停当前事务

6Progation.NERVER :作为非事务执行,如果当前存在事务,则抛出异常

7 porpagation.nested :与propagation.required的效果类似,如果当前事务存在,则嵌套事务的执行

隔离隔离级别:

1Isolation.DEFAULT:使用基础数据库的缺省隔离级别

2未提交2Isolation.READ_UNCOMMITTED读取

3已提交3Isolation.READ_COMMITTED读取

4Isolation.REPEATABLE_READ无法重复读取

5Isolation.SERIALIZABLE

如果不考虑隔离性带来的安全性问题,

脏读:一个事务读取了另一个事务的未提交数据

无法重复读取:的事务读取了另一个事务已经提交的update的数据,因此多次查询结果不再匹配。

幻想性地读取:个事务,读取另一个事务已经提交的insert的数据,多次查询结果不一致。

解决读取问题:事务隔离级别设置(五种类型) ) ) ) ) )。

DEFAULT这是平台事务隔离管理器的默认隔离级别,使用数据库的默认事务隔离级别。

未提交的读取(未提交) :脏读取,无法重复读取,可能发生误读

提交了“引线”(read commited ) :以避免脏引线。 但是,不能反复阅读,有可能发生误读

避免重复可读(repeatable read ) :脏读和不可重复读。 但是,有可能发生误读。

串行化:避免上述所有读取问题。

Mysql的默认:是可重载的

Oracle的默认:引线已提交

事务特性(4种) :

原子性(atomicity ) :强调事务的不可分割。

确保“一致性”(consistency ) :事务执行前后的数据完整性。

隔离(isolation ) :执行一个事务时,不要受到其他事务的干扰

当“持久性”(durability ) :事务结束时,数据将永久化到数据库中

事务被禁用的场景:

1事务注释被添加到非public限定的方法中,使用CglibAopProxy代理类时,absatractfallbacktransactionattributesource的computetransationationatribribute

2传播行为配置错误: Propagation.SUPPORTS,Propagation.NOT_SUPPORTED,Progation.NERVER

3@Transactional注释属性rollbackFor设置错误

4在同一类中没有事务注释的方法调用包含事务的方法,因为它使用的是AOP代理

5异常被catch吃掉了

6数据库引擎不支持诸如myisam之类的事务,Mysql默认使用Innodb默认支持事务

bean注入的几种方式,spring 注解实现原理