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