spring事务
原理
spring会创建一个jdbc的连接,并且关闭自动提交,等事务中的代码都执行完成后再提交。以动态代理的方式去管理事务。
简单分类
spring事务分两种,一种是编程式事务TransactionTemplate或PlatformTransactionManager,推荐使用TransactionTemplate,这是内嵌到方法中的事务,代码比较臃肿,但也有优势 它能给部分代码加事务部分代码不加。
@Autowired private TransactionTemplate transactionTemplate; public void testTransaction() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { // .... 业务代码 } catch (Exception e){ //回滚 transactionStatus.setRollbackOnly(); } } }); }
一种是声明式事务处理
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; boolean readOnly() default false; }
@Transaction作用在类中,该类所以的public 方法将具备事务属性
@Transaction作用在方法中,该方法将具备事务属性
propagation 传播特性
required: 有事务就用当前事务,没事务就创建一个事务
required_new:创建新事物
support: 有事务就用事务,没事务就不用事务
isolation:事务隔离级别
default:数据库默认的级别
timeout:超时时间,超时未执行完成会自动回滚
readonly:只读,为保证该事务中每次查询的数据都是一致的。
rollbackfor:回滚的异常,默认只在runtimeException和error时候才回滚,其他情况不回滚。加rollbackFor = Exception.class 出现所有的异常将回滚,否则只回滚RuntimeException
事务失效原因
@Transaction修饰的方法,非public
@Transaction所在类没有初始化成bean
数据库的引擎不支持事务(mysql数据库Innodb支持事务,myISAM不支持)
propagation设置问题 (propogation.NOT_SUPPORT不支持事务)
try catch导致已经捕获到异常,不抛出异常
参考:https://blog.csdn.net/weixin_45711797/article/details/126041812