String事务
声明式五个特性:传播机制 隔离机制 只读 事务超时 回滚原则
配置方式:
编程式事务管理:
TransactionTemplate(推荐)
PlatformTransactionManager
声明式事务管理
结合aop(面向接口编程),对方法前后拦截,在某个方法上执行前或直接加入一个事务
执行完目标方法后,根据执行情况提交或是回滚
事务特性:原子性 一致性 隔离性 持久性
传播机制:事务的嵌套
PROPAGATION_REQUIRED spring默认
PROPAGATION_REQUES_NEW
PROPAGATION_SUPPORT
PROPAGATION_NOT_SUPPORT
PROPAGATION_NEVER
PROPAGATION_MANDATORY
PROPAGATION_NESTED
隔离机制:一个事务可能受其他并发事务活动的影像程度,分为三种
脏读:发生一个事务读取啦另个事务修改尚未提交的数据时。数据回滚,第一次读取的数据无效
不可重复读 :重点在修改,同一个数据
同一个事务执行相同的查询两次以上,但每次查询结果不同。由于另一个并发事务在两次查询之间更新啦数据
幻读:重点在新增或删除,不同数据
理想状态下,事务之间完全隔离
隔离级别
ISOLATION_DEFAULT 后端数据库默认使用
ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的更改,可能导致脏读 幻读 不可重复度
ISOLATION_READ_COMMITTED oracle 默认级别 允许从已经提交的并发事务读取,防止脏读,其他可能会出现
ISOLATION_REPEATABLE_READ mysql默认级别 相同字段多次读取其结果一致,除非数据被当前事务本身改变,防止脏读,不可重复读,但幻读仍然发生
ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,
不发生 脏读,不可重复读,幻读,效率慢,因其完全锁定当前事务相关数据表。
只读 PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、 ROPAGATION_NESTED
事务超时 PROPAGATION_REQUIRES_NEW、PROPAGATION_REQUIRED、ROPAGATION_NESTED
回滚原则
在默认设置下,事务只在出现运行时异常(runtime exception)时回滚,而在出现受检查异常(checked exception)时不回滚(这一行为和EJB中的回滚行为是一致的)。
不过,可以声明在出现特定受检查异常时像运行时异常一样回滚。同样,也可以声明一个事务在出现特定的异常时不回滚,即使特定的异常是运行时异常。
Spring声明式事务配置参考
1.事务传播性:@Transaction(propagation=Propagation.REQUIRE)
2.事务隔离级别:@Transaction(Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读,不可重复读)基本不使用
3.只读:@Transaction(readOnly=true)
4.事务的超时性@Transaction(timeout=30)
5.回滚
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类: @Transactional(rollbackFor={RuntimeException.class,Exception.class})
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。
学习参考: https://www.cnblogs.com/mseddl/p/11577846.html
原文:https://www.cnblogs.com/hhnature/p/14791189.html