日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring事務執行流程及如何創建事務

瀏覽:22日期:2023-07-18 18:05:30

接上節內容,Spring事務執行原理通過創建一個BeanFactoryTransactionAttributeSourceAdvisor,并把TransactionInterceptor注入進去,而TransactionInterceptor實現了Advice接口。而Spring Aop在Spring中會把Advisor中的Advice轉換成攔截器鏈,然后調用。

執行流程 獲取對應事務屬性,也就是獲取@Transactional注解上的屬性 獲取TransactionManager,常用的如DataSourceTransactionManager事務管理 在目標方法執行前獲取事務信息并創建事務 回調執行下一個調用鏈 一旦出現異常,嘗試異常處理,回滾事務 提交事務 具體分析

獲取對應事務屬性,具體代碼執行流程如下:

final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);

protected TransactionAttribute computeTransactionAttribute(Method method, Class<?> targetClass) { // Don’t allow no-public methods as required. //1. allowPublicMethodsOnly()返回true,只能是公共方法 if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) { return null; } // Ignore CGLIB subclasses - introspect the actual user class. Class<?> userClass = ClassUtils.getUserClass(targetClass); // The method may be on an interface, but we need attributes from the target class. // If the target class is null, the method will be unchanged. //method代表接口中的方法、specificMethod代表實現類的方法 Method specificMethod = ClassUtils.getMostSpecificMethod(method, userClass); // If we are dealing with method with generic parameters, find the original method. //處理泛型 specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); // First try is the method in the target class. //查看方法中是否存在事務 TransactionAttribute txAttr = findTransactionAttribute(specificMethod); if (txAttr != null) { return txAttr; } // Second try is the transaction attribute on the target class. //查看方法所在類是否存在事務聲明 txAttr = findTransactionAttribute(specificMethod.getDeclaringClass()); if (txAttr != null && ClassUtils.isUserLevelMethod(method)) { return txAttr; } //如果存在接口,則在接口中查找 if (specificMethod != method) { // Fallback is to look at the original method. //查找接口方法 txAttr = findTransactionAttribute(method); if (txAttr != null) { return txAttr; } // Last fallback is the class of the original method. //到接口類中尋找 txAttr = findTransactionAttribute(method.getDeclaringClass()); if (txAttr != null && ClassUtils.isUserLevelMethod(method)) { return txAttr; } } return null;}

getTransactionAttributeSource()獲得的對象是在ProxyTransactionManagementConfiguration創建bean時注入的AnnotationTransactionAttributeSource對象。 AnnotationTransactionAttributeSource中getTransactionAttributeSource方法主要邏輯交給了computeTransactionAttribute方法,所以我們直接看computeTransactionAttribute代碼實現。

computeTransactionAttribute方法執行的邏輯是:

判斷是不是只運行公共方法,在AnnotationTransactionAttributeSource構造方法中傳入true。若方法不是公共方法,則返回null。 得到具體的方法,method方法可能是接口方法或者泛型方法。 查看方法上是否存在事務 查看方法所在類上是否存在事務 查看接口的方法是否存在事務,查看接口上是否存在事務。

所以如果一個方法上用了@Transactional,類上和接口上也用了,以方法上的為主,其次才是類,最后才到接口。

獲取TransactionManager,具體代碼執行流程如下:

protected PlatformTransactionManager determineTransactionManager(TransactionAttribute txAttr) { // Do not attempt to lookup tx manager if no tx attributes are set if (txAttr == null || this.beanFactory == null) { return getTransactionManager(); } String qualifier = txAttr.getQualifier(); if (StringUtils.hasText(qualifier)) { return determineQualifiedTransactionManager(qualifier); } else if (StringUtils.hasText(this.transactionManagerBeanName)) { return determineQualifiedTransactionManager(this.transactionManagerBeanName); } else { //常用的會走到這里 PlatformTransactionManager defaultTransactionManager = getTransactionManager(); if (defaultTransactionManager == null) { defaultTransactionManager = this.transactionManagerCache.get(DEFAULT_TRANSACTION_MANAGER_KEY); if (defaultTransactionManager == null) { //從beanFactory獲取PlatformTransactionManager類型的bean defaultTransactionManager = this.beanFactory.getBean(PlatformTransactionManager.class); this.transactionManagerCache.putIfAbsent( DEFAULT_TRANSACTION_MANAGER_KEY, defaultTransactionManager); } } return defaultTransactionManager; }}

@Beanpublic PlatformTransactionManager txManager() { return new DataSourceTransactionManager(dataSource());}創建事務主要兩部分: 獲取事務狀態 構建事務信息 獲取事務狀態

代碼如下:

@Override public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { //1.獲取事務 Object transaction = doGetTransaction(); // Cache debug flag to avoid repeated checks. boolean debugEnabled = logger.isDebugEnabled(); if (definition == null) { // Use defaults if no transaction definition given. definition = new DefaultTransactionDefinition(); } //判斷當前線程是否存在事務,判斷依據為當前線程記錄連接不為空且連接中的(connectionHolder)中的transactionActive屬性不為空 if (isExistingTransaction(transaction)) { // Existing transaction found -> check propagation behavior to find out how to behave. return handleExistingTransaction(definition, transaction, debugEnabled); } // Check definition settings for new transaction. //事務超時設置驗證 if (definition.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) { throw new InvalidTimeoutException('Invalid transaction timeout', definition.getTimeout()); } // No existing transaction found -> check propagation behavior to find out how to proceed. //如果當前線程不存在事務,但是@Transactional卻聲明事務為PROPAGATION_MANDATORY拋出異常 if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) { throw new IllegalTransactionStateException( 'No existing transaction found for transaction marked with propagation ’mandatory’'); } //如果當前線程不存在事務,PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED都得創建事務 else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW || definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) { //空掛起 SuspendedResourcesHolder suspendedResources = suspend(null); if (debugEnabled) { logger.debug('Creating new transaction with name [' + definition.getName() + ']: ' + definition); } try { //默認返回true boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); //構建事務狀態 DefaultTransactionStatus status = newTransactionStatus( definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); //構造transaction、包括設置connectionHolder、隔離級別、timeout //如果是新事務,綁定到當前線程 doBegin(transaction, definition); //新事務同步設置,針對當前線程 prepareSynchronization(status, definition); return status; } catch (RuntimeException ex) { resume(null, suspendedResources); throw ex; } catch (Error err) { resume(null, suspendedResources); throw err; } } else { // Create 'empty' transaction: no actual transaction, but potentially synchronization. if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT && logger.isWarnEnabled()) { logger.warn('Custom isolation level specified but no actual transaction initiated; ' + 'isolation level will effectively be ignored: ' + definition); } //聲明事務是PROPAGATION_SUPPORTS boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS); return prepareTransactionStatus(definition, null, true, newSynchronization, debugEnabled, null); }}構建事務信息 獲取事務,創建對應的事務實例,這里使用的是DataSourceTransactionManager中的doGetTransaction方法,創建基于JDBC的事務實例,如果當前線程中存在關于dataSoruce的連接,那么直接使用。這里有一個對保存點的設置,是否開啟允許保存點取決于是否設置了允許嵌入式事務。DataSourceTransactionManager默認是開啟的。 如果當先線程存在事務,則轉向嵌套的事務處理。是否存在事務在DataSourceTransactionManager的isExistingTransaction方法中 事務超時設置驗證 事務PropagationBehavior屬性的設置驗證 構建DefaultTransactionStatus。 完善transaction,包括設置connectionHolder、隔離級別、timeout,如果是新事務,綁定到當前線程 將事務信息記錄在當前線程中

以上就是Spring事務執行流程及如何創建事務的詳細內容,更多關于Spring事務執行流程及如何創建的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品国产嫩草在线观看| 亚洲免费影视| 亚洲人亚洲人色久| 亚洲精品自拍| 91精品国产自产精品男人的天堂| 亚洲欧洲日韩精品在线| 日韩在线黄色| 国产精品第十页| 国内不卡的一区二区三区中文字幕| 免费亚洲婷婷| 另类小说一区二区三区| 日韩一区三区| 亚洲一区免费| 国产三级精品三级在线观看国产| 国产乱子精品一区二区在线观看 | 九九久久婷婷| 日韩中文字幕无砖| 加勒比视频一区| 欧美日韩视频| 国产精品亚洲欧美一级在线| 久久亚洲人体| 一区在线免费| 国产精品久久亚洲不卡| 欧美天堂视频| 亚洲三级精品| av亚洲一区二区三区| 亚洲网址在线观看| 老色鬼精品视频在线观看播放| 日韩精品2区| 日韩网站在线| 欧美激情网址| 欧美专区18| 成人片免费看| 欧美日韩一区二区高清| 久久美女精品| 美女视频网站久久| 另类av一区二区| 成人精品国产亚洲| 日韩三级视频| 久久久影院免费| 国产精品久久观看| 欧美天堂一区| 亚洲神马久久| 99精品在线| 国产日韩欧美一区二区三区 | 日韩国产欧美在线播放| 免费av一区| 肉色欧美久久久久久久免费看| 欧美日本久久| 日本不卡一二三区黄网| 国内精品福利| 久久久久国产精品一区二区| 国产精品2023| 国产精品流白浆在线观看| 红桃视频国产精品| 精精国产xxxx视频在线野外| 日韩av片子| 黄色网一区二区| 国产aⅴ精品一区二区三区久久| 欧美日韩调教| 国产伦精品一区二区三区视频| 天海翼亚洲一区二区三区| 国产精品老牛| 综合激情网站| 日本成人中文字幕| 日本免费一区二区视频| 97在线精品| 天堂av在线| 四虎在线精品| 欧美特黄一级| 日韩在线一区二区| 亚洲精品影视| 日韩在线观看中文字幕| 日韩精品电影一区亚洲| 国产精品国码视频| 天堂8中文在线最新版在线| 欧美69视频| 亚洲精品三级| 国产精品一区高清| 国产一区二区三区黄网站| 91免费精品| 国产精品色网| 国产精品久一| 亚洲女同一区| 日本成人在线不卡视频| 精品一区二区三区亚洲| 免费精品国产的网站免费观看| 亚州av日韩av| 欧美日韩一二三四| 日韩精品久久久久久久软件91| 日韩精品dvd| 日本午夜精品| 欧美 日韩 国产一区二区在线视频| 日韩三级一区| japanese国产精品| 久久午夜影院| 亚洲2区在线| 午夜欧美精品| 久久天堂影院| 亚洲精品乱码| 99久久精品国产亚洲精品| 欧美日韩精品一区二区三区视频 | www.51av欧美视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产专区精品| 国产精品中文字幕亚洲欧美 | 精品欧美视频| 日韩精品1区2区3区| 亚洲精品1区2区| 午夜精品成人av| 国产精品a久久久久| 蜜桃久久久久久久| 中文精品视频| 在线一区av| 国产精品22p| 欧美日韩视频免费看| 中文字幕日韩高清在线| 五月精品视频| 久久国产直播| 极品av在线| 国产欧美高清| 日韩区欧美区| 亚洲精品美女91| 综合激情婷婷| 91av一区| 日韩av网站在线免费观看| 蜜臀久久久久久久| 天堂va蜜桃一区二区三区| 99日韩精品| 三级亚洲高清视频| 一区二区亚洲视频| 中文字幕一区日韩精品| 亚洲va久久久噜噜噜久久| 日韩手机在线| 九九九精品视频| 里番精品3d一二三区| 国产精品原创| 亚洲婷婷免费| 性欧美长视频| 日韩国产成人精品| 久久不见久久见中文字幕免费| 免费亚洲婷婷| 久久中文视频| 一区二区国产在线| 国产麻豆精品久久| 亚洲天堂一区二区| 一区二区日韩免费看| 欧美成人一二区| 欧美一区二区性| 日韩区欧美区| 91一区二区| 免费成人在线视频观看| 精品一区二区三区的国产在线观看 | 久久精品亚洲人成影院| 在线综合视频| 久久久久久婷| 免费在线看一区| 美女视频黄 久久| 丝袜美腿亚洲一区| 手机在线电影一区| 免费不卡在线观看| 欧洲一区二区三区精品| 蜜臀精品一区二区三区在线观看| 亚洲免费毛片| 91精品婷婷色在线观看| 久久国产日韩欧美精品| 91久久视频| 日韩毛片视频| 国产欧美日韩精品一区二区免费 | 久久av导航| 久久亚洲不卡| www成人在线视频| 国产激情久久| 三级久久三级久久久| 国产成人免费视频网站视频社区| 老鸭窝毛片一区二区三区| 色偷偷色偷偷色偷偷在线视频| 日韩黄色在线观看| 鲁大师影院一区二区三区| 欧美丰满日韩| 国产精品久久久久蜜臀| 国产精品日韩精品在线播放| 亚洲日本免费电影| 快she精品国产999| 在线观看免费一区二区| 久久久成人网| 999久久久国产精品| 岛国av在线网站| 成人影视亚洲图片在线| 国产探花一区| 国产日本亚洲| 日韩国产欧美视频| 日韩精品一区二区三区免费视频| 少妇精品久久久一区二区三区| 亚洲专区视频| 久久精品999| 欧美国产不卡| 偷拍精品精品一区二区三区| 久久中文视频| 免费久久99精品国产|