Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

事务传播级别探究

964 views

Published on

  • spring事务相关
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

事务传播级别探究

  1. 1. 事务传播级别探究 —— 怎样利用事务传播级别解决不同的业务需求
  2. 2. 什么是传播级别 <ul><ul><li>事务传播级别是事务本身的一个属性,决定当前事务执行期间与外部事务的关系。 </li></ul></ul><ul><ul><li>加入外部事务? </li></ul></ul><ul><ul><li>挂起外部,重新开始新事务? </li></ul></ul><ul><ul><li>不允许执行事务? </li></ul></ul>
  3. 3. 在事务中如何被定义? <ul><ul><li>TransactionDefinition 接口中定义了其中事务传播级别 </li></ul></ul><ul><ul><li>public interface TransactionDefinition {    </li></ul></ul><ul><ul><li>int getPropagationBehavior();    </li></ul></ul><ul><ul><li>     int getIsolationLevel();    </li></ul></ul><ul><ul><li>     int getTimeout();    </li></ul></ul><ul><ul><li>     boolean isReadOnly();    </li></ul></ul><ul><ul><li>}  </li></ul></ul>
  4. 4. 七种事务传播级别 <ul><ul><li>PROPAGATION_REQUIRED </li></ul></ul><ul><ul><li>PROPAGATION_REQUIRES_NEW </li></ul></ul><ul><ul><li>PROPAGATION_MANDATORY </li></ul></ul><ul><ul><li>PROPAGATION_NEVER </li></ul></ul><ul><ul><li>PROPAGATION_SUPPORTS </li></ul></ul><ul><ul><li>PROPAGATION_NOT_SUPPORTED </li></ul></ul><ul><ul><li>PROPAGATION_NESTED </li></ul></ul>
  5. 5. PROPAGATION_REQUIRED <ul><ul><li>如果外部已经存在事务,则加入外部事务,如果外部不存在事务,则新建一个事务。 </li></ul></ul><ul><ul><li>存在父事务 </li></ul></ul>子事务 加入父事务 不存在事务 子事务 新建事务运行
  6. 6. 举例说明 <ul><ul><li>methodA (){ </li></ul></ul><ul><ul><li>doSomethingA(); </li></ul></ul><ul><ul><li>methodB(); //call methodB </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRED </li></ul></ul><ul><ul><li>methodB (){ </li></ul></ul><ul><ul><li>doSomethingB(); </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRED </li></ul></ul>
  7. 7. PROPAGATION_REQUIRES_NEW <ul><ul><li>不管外部是否有事务,都新建事务运行 </li></ul></ul>父事务 子事务 新建事务 挂起 恢复
  8. 8. 举例说明 <ul><ul><li>methodA (){ </li></ul></ul><ul><ul><li>doSomethingA(); </li></ul></ul><ul><ul><li>methodB();//call methodB </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRED </li></ul></ul><ul><ul><li>methodB (){ </li></ul></ul><ul><ul><li>doSomethingB(); </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRES_NEW </li></ul></ul>
  9. 9. PROPAGATION_MANDATORY <ul><ul><li>外部必须存在事务,加入外部事务执行,否则抛出异常 </li></ul></ul>存在父事务 加入父事务 子事务 不存在父事务 子事务
  10. 10. 举例说明 <ul><ul><li>methodA (){ </li></ul></ul><ul><ul><li>doSomethingA(); </li></ul></ul><ul><ul><li>methodB(); //call methodB </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRED </li></ul></ul><ul><ul><li>methodB (){ </li></ul></ul><ul><ul><li>doSomethingB(); </li></ul></ul><ul><ul><li>} //PROPAGATION_MANDATORY  </li></ul></ul>
  11. 11. PROPAGATION_NEVER <ul><ul><li>外部不能存在事务,如果存在事务,则抛出异常 </li></ul></ul>子事务 父事务 不存在父事务 非事务方式运行
  12. 12. 举例说明 <ul><ul><li>methodA (){ </li></ul></ul><ul><ul><li>doSomethingA(); </li></ul></ul><ul><ul><li>methodB(); //call methodB </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRED </li></ul></ul><ul><ul><li>methodB (){ </li></ul></ul><ul><ul><li>doSomethingB(); </li></ul></ul><ul><ul><li>} //PROPAGATION_NEVER  </li></ul></ul>
  13. 13. PROPAGATION_SUPPORTS <ul><ul><li>外部存在事务则加入事务,不存在事务则以非事务的方式运行 </li></ul></ul>子事务 加入父事务 父事务 不存在父事务 非事务方式运行
  14. 14. PROPAGATION_NOT_SUPPORTED <ul><ul><li>总是以非事务方式运行,并挂起任何事务 </li></ul></ul>父事务 非事务方式运行 挂起 恢复
  15. 15. 举例说明 <ul><ul><li>methodA (){ </li></ul></ul><ul><ul><li>doSomethingA(); </li></ul></ul><ul><ul><li>methodB(); //call methodB </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRED </li></ul></ul><ul><ul><li>methodB (){ </li></ul></ul><ul><ul><li>doSomethingB(); </li></ul></ul><ul><ul><li>} //PROPAGATION_NOT_SUPPORTED  </li></ul></ul>
  16. 16. PROPAGATION_NESTED <ul><ul><li>外部存在事务,嵌套执行。不存在事务,新建事务。 </li></ul></ul><ul><ul><li>注意与 PROPAGATION_REQUIRED 的区别!! </li></ul></ul>父事务 savePoint 子事务 作为父事务的一部分执行
  17. 17. 举例说明 <ul><ul><li>methodA (){ </li></ul></ul><ul><ul><li>doSomethingA(); </li></ul></ul><ul><ul><li>methodB(); //call methodB </li></ul></ul><ul><ul><li>} //PROPAGATION_REQUIRED </li></ul></ul><ul><ul><li>methodB (){ </li></ul></ul><ul><ul><li>doSomethingB(); </li></ul></ul><ul><ul><li>} //PROPAGATION_NESTED  </li></ul></ul>
  18. 18. 推荐资料 <ul><ul><li>http://www.javaeye.com/topic/78674 详解 spring 事务属性 </li></ul></ul><ul><ul><li>http://www.javaeye.com/topic/35907 解惑 spring 嵌套事务 </li></ul></ul>
  19. 19. 请看 eclipse 代码演示 <ul><ul><li>红包项目中事务隔离级别的典型应用 </li></ul></ul><ul><ul><li>FAQ </li></ul></ul>
  20. 20. 下期预告 <ul><ul><li>《事务隔离级别探究》 </li></ul></ul><ul><ul><li>读出的数据让你困惑? </li></ul></ul><ul><ul><li>《 log4J 到底干了什么》 </li></ul></ul><ul><ul><li>你的日志是怎样被他处理的?日志如何精准定位? </li></ul></ul><ul><ul><li>《带逻辑 SQL 写法的探究》 </li></ul></ul><ul><ul><li>如何不用 java 逻辑处理一次获取到你要的显示结果? </li></ul></ul>
  21. 21. <ul><ul><li>首先感谢祖国!谢谢大家! </li></ul></ul>

×