事务基础知识点
2021-11-09 17:26:35 0 举报
AI智能生成
事务基础知识点
作者其他创作
大纲/内容
Spring事务执行流程
使用AOP CGLIB 将事务逻辑织入方法
AbstractAutowireCapableBeanFactory.doCreateBean -> initializeBean
在代码运行的时候,调用代理类会跳转到
TransactionAspectSupport#invokeWithinTransaction
将数据库的自动提交关闭,改为手动提交事务
在DataSourceTransactionManager 类中
con.setAutoCommit(false);
执行方法内的代码,方法体代码会执行完成
在第一次操作数据库时,例如select 操作时,开启事务
try{
retVal = invocation.proceedWithInvocation();
}
retVal = invocation.proceedWithInvocation();
}
如果代码有异常,会被捕获回滚
catch (Throwable ex) {
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
清理资源,例如隔离级别的设置,传播机制的设置
finally {
cleanupTransactionInfo(txInfo);
}
cleanupTransactionInfo(txInfo);
}
提交事务并返回结果
commitTransactionAfterReturning(txInfo)
Spring事务隔离级别
TransactionDefinition.ISOLATION_DEFAULT
使用默认隔离级别
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
读未提交。可以读到事务还未提交的数据,会产生脏读
TransactionDefinition.ISOLATION_READ_COMMITTED
读已提交。只能读取到事务已提交的数据。
会有“不可重复度的问题”,因为这一行数据没有锁,可以被别的事务提交修改
会有“不可重复度的问题”,因为这一行数据没有锁,可以被别的事务提交修改
TransactionDefinition.ISOLATION_REPEATABLE_READ
可重复读,在事务周期内给一行数据加锁
TransactionDefinition.ISOLATION_SERIALIZABLE
数据库最高的隔离级别,它要求所有的SQL都会按照顺序执行,
这样可以克服上述所有隔离出现的各种问题,能够完全包住数据的一致性。
这样可以克服上述所有隔离出现的各种问题,能够完全包住数据的一致性。
Spring事务传播机制
TransactionDefinition.PROPAGATION_REQUIRED(默认)
支持当前事务,如果当前没有事务,则新建事务
如果当前存在事务,则加入当前事务,合并成一个事务
如果当前存在事务,则加入当前事务,合并成一个事务
TransactionDefinition.PROPAGATION_SUPPORTS
如果当前存在事务,则加入事务
如果当前不存在事务,则以非事务方式运行,这个和不写没区别
如果当前不存在事务,则以非事务方式运行,这个和不写没区别
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
以非事务方式运行
如果当前存在事务,则把当前事务挂起
如果当前存在事务,则把当前事务挂起
TransactionDefinition.PROPAGATION_MANDATORY
如果当前存在事务,则运行在当前事务中
如果当前无事务,则抛出异常,也即父级方法必须有事务
如果当前无事务,则抛出异常,也即父级方法必须有事务
TransactionDefinition.PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,则把当前事务挂起
这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交
这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交
TransactionDefinition.PROPAGATION_NEVER
以非事务方式运行,如果当前存在事务,则抛出异常,即父级方法必须无事务
TransactionDefinition.PROPAGATION_NESTED
如果当前存在事务,它将会成为父级事务的一个子事务,方法结束后并没有提交,只有等父事务结束才提交
如果当前没有事务,则新建事务
如果它异常,父级可以捕获它的异常而不进行回滚,正常提交
但如果父级异常,它必然回滚,这就是和 REQUIRES_NEW 的区别
如果当前没有事务,则新建事务
如果它异常,父级可以捕获它的异常而不进行回滚,正常提交
但如果父级异常,它必然回滚,这就是和 REQUIRES_NEW 的区别
事务特性
原子性(Atomicity)
事务的所有操作要么全部成功,要么全部回滚。
一致性(Consistency)
总是从一个一致性的状态转换到另一个一致性的状态。
隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行
持久性(Durability)
已被提交的事务对数据库的修改应该永久保存在数据库中
事务问题
脏读,读到了未提交的内容
幻读,获取数据count每次都不一样,表锁解决
不可重复度,获取同一行数据,每次结果不一样。行锁解决
0 条评论
下一页