Spring事务

1. 数据库事务
    commit
    rollback
2. @Transactional注解底层工作原理源码解析
    1)有Transactional注解,生成要给代理bean类      代理逻辑
    2)执行方法前,datasource 获取一个数据库连接,spring建立的数据库连接,connection.setAutoCommit(false)
    3)执行脚本
    4)connection.commit();   代理逻辑
3. 传播机制源码解析
    默认是require
    业务逻辑A  Propagation.REQUIRED    
    业务逻辑B  Propagation.REQUIRED
    1)spring建立数据库连接conn1
    2)ThreadLocal(conn1)
    3)conn1.setAutoCommit(false)
    4)业务逻辑a Propagation.REQUIRED
    5)业务逻辑b
    6)conn1.commit()
    
    
    业务逻辑A  Propagation.REQUIRED    
    业务逻辑B  Propagation.REQUIRES_NEW
    1)spring建立数据库连接conn1
    2)ThreadLocal(conn1)
    3)conn1.setAutoCommit(false
    4) 执行业务A
    5) conn1 挂起 (从ThteadLocal中移出,放到另外的对象中)
    6)spring建立数据库连接2 conn2
    7)ThreadLocal(conn2)
    8)conn2.setAutoCommit(false)
    9)执行业务B
    10)conn2.commit()
    11)conn1 恢复  conn1 --> ThreadLocal
    12)conn1.commit()
    
    
    业务逻辑A  Propagation.REQUIRED    
    业务逻辑B  Propagation.NESTED
    1)spring建立数据库连接conn1
    2)ThreadLocal(conn1)
    3)conn1.setAutoCommit(false
    4) 执行业务A
    5) savepoint  xxx
    6)执行业务B
    7)抛出异常,  首先 rollback  xxx
    8)如果 业务逻辑Acatch了异常后,不抛出,conn1还是可以提交的。如果业务逻辑A继续抛出异常,conn1也会回滚
    
    
    
    
    业务逻辑A  Propagation.REQUIRED    
    业务逻辑B ,private 方法,  Propagation.NEVER        
    代理对象.test()
        1 建立数据库连接
        2 业务逻辑A  -----> 原始对象的.test()
            2.1 因为 业务逻辑B 是private方法,不会生效,所以直接当作没有事务注解执行(事务只对public的方法生效),即执行的是代理对象的方法,代理对象的属性是不会进行自动依赖注入的。
    
4. TransactionSynchronizationManager源码解析
    
    org.springframework.transaction.support.TransactionSynchronization
    
    
    AutoProxyRegistrar  --->  
    
    ProxyTransactionManagermentConfiguration
        Transaction
        TransactionInterceptor  : @Transactionoal的信息,超时时间,隔离级别等  事务的代理逻辑是在这里实现的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值