spring事务管理,如何实现Transactional注解
通过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默认支持事务