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