单位网站服务的建设及维护,做漫画在线观看网站,销售网站建设的会计分录,网站域名使用前面说到用数据库中的锁机制对并发事务进行控制#xff0c;这节来说说事务方法和事务方法发生嵌套调用时事务如何进行传播。例如#xff1a;方法可能继续在现有事务中运行#xff0c;也可能开启一个新事务#xff0c;并在自己的事务中运行。例如#xff1a;方法可能继续在…前面说到用数据库中的锁机制对并发事务进行控制这节来说说事务方法和事务方法发生嵌套调用时事务如何进行传播。例如方法可能继续在现有事务中运行也可能开启一个新事务并在自己的事务中运行。例如方法可能继续在现有事务中运行也可能开启一个新事务并在自己的事务中运行。Spring定义了七种传播行为 传播行为 含义 PROPAGATION_REQUIRED 表示当前方法必须运行在事务中。如果当前事务存在方法将会在该事务中运行。否则会启动一个新的事务 PROPAGATION_SUPPORTS 表示当前方法不需要事务上下文但是如果存在当前事务的话那么该方法会在这个事务中运行 PROPAGATION_MANDATORY 表示该方法必须在事务中运行如果当前事务不存在则会抛出一个异常 PROPAGATION_REQUIRED_NEW表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务在该方法执行期间当前事务会被挂起。 PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务中。如果存在当前事务在该方法运行期间当前事务将被挂起。 PROPAGATION_NEVER 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行则会抛出异常 PROPAGATION_NESTED表示如果当前已经存在一个事务那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在那么其行为与PROPAGATION_REQUIRED一样。 一个事务中会有多个dao层接口需要与数据库建立连接存取数据那就需要保证这些dao操作调用的都是一个connection对象这样才能保证事务执行的正确性。那这又是如何保证的呢 源码比较多等有时间再慢慢分析简单说就是 1TransactionSynchronizationManager内部用ThreadLocal对象存储资源ThreadLocal存储的为DataSource生成的actualKey为key值和ConnectionHolder作为value值封装成的Map。 2 结合DataSourceUtils的doGetConnection函数和TransactionSynchronizationManager的bindResource函数可知在某个线程第一次调用时候封装Map资源为key值为DataSource生成actualKey【Object actualKey TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);】value值为DataSource获得的Connection对象封装后的ConnectionHolder。等这个线程下一次再次访问中就能保证使用的是第一次创建的ConnectionHolder中的Connection对象。 说了事务的传播属性、隔离规则顺着这条线说说Spring的事务管理先看下Spring事务管理的接口框架。 Spring并不直接管理事务而是提供了多种事务管理器他们将事务管理的职责委托给hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。 前面介绍了事务隔离规则、传播特性那么事务中还有那些特性 事务超时 为了使应用程序很好地运行事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定所以长时间的事务会不必要的占用数据库资源。事务超时就是事务的一个定时器在特定时间内事务如果没有执行完毕那么就会自动回滚而不是一直等待其结束。 回滚规则 事务五边形的最后一个方面是一组规则这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下事务只有遇到运行期异常时才会回滚而在遇到检查型异常时不会回滚。但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样你还可以声明事务遇到特定的异常不回滚即使这些异常是运行期异常。 只读 事务的第三个特性是它是否为只读事务。如果事务只对后端的数据库进行该操作数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读你就可以给数据库一个机会让它应用它认为合适的优化措施。 编程式和声明式事务 Spring提供了对编程式事务和声明式事务的支持编程式事务允许用户在代码中精确定义事务的边界而声明式事务基于AOP有助于用户将操作与事务规则进行解耦。 简单地说编程式事务侵入到了业务代码里面但是提供了更加详细的事务管理而声明式事务由于基于AOP所以既能起到事务管理的作用又可以不影响业务代码的具体实现。 以上有的并没有实际的开发经历所以感受不是很深先作为一个了解吧 转载于:https://www.cnblogs.com/linyukun/p/9892523.html