當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring七中传播行为详解
生活随笔
收集整理的這篇文章主要介紹了
Spring七中传播行为详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Spring事物傳播行為
Spring中事務的定義:
Propagation(key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。)有以下選項可供使用:
PROPAGATION_REQUIRED—如果當前有事務,就用當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行。//如果外層方法沒有事務,
就會以非事務進行執(zhí)行。
PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。
--- 如果當前有事務,就是以非事務進行執(zhí)行
PROPAGATION_NEVER--以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。默認傳播行為為REQUIRED
?
上節(jié)課已經(jīng)把兩種傳播行為講完了,后面還有幾種,我就一一給大家講,這里還有一個SUPPORTS,這種我給你講一下,傳播行為應用場景,場景是什么,這個事情說一下,比如我給你講一個場景,開發(fā)的時候都是多個人整合,如果你碰到去調(diào)用別人的service的時候,那么說一下,你這個時候要記住一點,一定要搞清楚傳播行為,其實別人寫的一個service,你調(diào)用別人的service,別人的service也是加了事務注解的,你就要去問一下別人,什么意思呢,就是說,問一下別人,我的事務會不會影響到你的事務,這樣的,這里就要考慮傳播行為了,如果不影響的話,你就用required_new就行了,然后在這邊我再講一種,叫做支持SUPPORTS,其實這個用的比較少,它是支持當前的事務,如果當前沒有事務,就以非事務進行執(zhí)行,這個你們知道是什么意思嗎,知不知道什么意思,這個其實就是事務嵌套,我馬上就要講嵌套了,支持當前事務,如果當前沒有事務,就以非事務進行執(zhí)行,這是什么意思,有沒有誰能解釋一下的,這個其實什么意思呢,在這邊說一下,支持當前事務,如果當前沒有事務,比如這個時候你們看一下,如果add當前沒有事務的情況下,然后我把addLog的事務級別設置一下,@Transactional(propagation = Propagation.SUPPORTS),那么我來問一下,這個時候我突然報個錯,@Transactional(propagation = Propagation.REQUIRES_NEW)public void addLog() {/*** 加個時間戳System.currentTimeMillis()* */logDao.add("addLog" + System.currentTimeMillis());int i = 1 / 0;}// @Transactionalpublic void add() {logService.addLog(); userDao.add("test001", 20);int i = 1 / 0;System.out.println("################");userDao.add("test002", 21);}int i = 1/0,你們說一下這個是什么意思,這個時候日志能不能插入進去,這個時候log日志能不能插入進去,當前沒有事務的情況下就以非事務進行執(zhí)行,就是這樣的,我設置的是新的級別,新的傳播行為,你們看一下,后面的幾種你們可以慢慢的去摸索一下就行了,我把外面的事務給注釋掉了,你們看看效果,你們看一下是不是報錯了,最后我們刷新一遍,是不是也有記錄的,我們想一下是什么意思,你們要記住,如果當前沒有事務的情況下,就以非事務進行執(zhí)行,相當于我沒有事務,沒有事務的情況下,我肯定能夠插入進去,就是外面你調(diào)我的方法的時候,如果沒有事務注解,里面就以非事務進行執(zhí)行,然后我們再講MANDATORY這種,支持當前事務,如果當前沒有事務就拋出異常,這也是借鑒一本書上寫的,如果外層方法沒有事務,就會以非事務進行執(zhí)行,我們再說一種就是PROPAGATION_MANDATORY這種方式,就是支持當前事務,如果當前沒有事務就拋出異常,我們來設置一下這種傳播行為,這里我來問你們,如果當期沒事務,你們看看,當前是沒有事務的,然后運行肯定報錯,不是int i = 1/0報錯,是不是報錯了,什么意思,他就是他沒有檢測到他當前有事務,就是你的add調(diào)用我的方法是沒有事務,我們可以把這個注解加上去,支持當前事務,如果當前沒有事務才會報錯,有事務怎么可能報錯,REQUIRES_NEW我們已經(jīng)講了,我們再講一種PROPAGATION_NOT_SUPPORTS,以非事務執(zhí)行操作,如果當前存在事務,就把當前事務掛起,這是什么意思呢,有誰知道,就是相當于,如果當前有事務,正好是和PROPAGATION_SUPPORTS相反的,如果當前有事務,就是以非事務進行執(zhí)行,就是剛好相反的,看下效果就行了,add存在事務,如果當前存在事務,掛起不報錯,只是掛起,相當于失效,不會報錯,就是addLog這邊會以非事務進行執(zhí)行,然后我們搞一個 int i = 1/0,public void addLog() {logDao.add("addLog" + System.currentTimeMillis());int i = 1 / 0;}報錯了,但是數(shù)據(jù)庫日志記錄還是有的,當前如果有事務就把當前的事務掛起,這個比較簡單你們下去看一下,都是比較容易的,然后我們這里再講一種,以非事務進行執(zhí)行,如果當前存在事務,則拋出異常,以非事務進行異常,你們下去試一試,就是看效果,我要說一下,以非事務進行執(zhí)行,如果當前有事務就拋異常,這個才會拋異常,你們看一下,Existing transaction found for transaction marked with propagation 'never'如果當前存在事務的情況下,他就拋個異常出來,是不是這樣的,你們下去試一下就行了,傳播行為不是我們的核心,核心是我們的手寫事務 <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- aop的掃包注解是有的 --><context:component-scan base-package="com.learn"></context:component-scan><aop:aspectj-autoproxy></aop:aspectj-autoproxy> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/day20"></property><property name="user" value="root"></property><property name="password" value="123456"></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><bean id="dataSourceTransactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 我們把原生的事務注解刪掉 --><tx:annotation-driven transaction-manager="dataSourceTransactionManager" /> </beans> package com.learn.dao;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository;@Repository public class LogDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void add(String name) {String sql = "INSERT INTO t_log(log_name) VALUES(?);";int updateResult = jdbcTemplate.update(sql, name);System.out.println("##LogDao##updateResult:" + updateResult);}} package com.learn.service;public interface LogService {public void addLog();} package com.learn.service.impl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;import com.learn.dao.LogDao; import com.learn.service.LogService;/*** 7種傳播行為* 這個問的比較多的* 注入到Spring容器里面去@Service* * * @author Leon.Sun**/ @Service public class LogServiceImpl implements LogService {/*** 把@Autowired這個注解也加上去* */@Autowiredprivate LogDao logDao;// @Transactional(propagation = Propagation.REQUIRES_NEW) // @Transactional // @Transactional(propagation = Propagation.SUPPORTS) // @Transactional(propagation = Propagation.MANDATORY) // @Transactional(propagation = Propagation.NOT_SUPPORTED)@Transactional(propagation = Propagation.NEVER)public void addLog() {logDao.add("addLog" + System.currentTimeMillis()); // int i = 1 / 0;}} package com.learn.service;//user 服務層 public interface UserService {public void add();public void del();} package com.learn.service.impl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import com.learn.dao.UserDao; import com.learn.service.LogService; import com.learn.service.UserService; import com.learn.transaction.TransactionUtils;@Service public class UserServiceImpl implements UserService {@Autowiredprivate TransactionUtils transactionUtils;@Autowiredprivate UserDao userDao;@Autowiredprivate LogService logService;/*** 加上@Transactional這個注解* */@Transactionalpublic void add() {logService.addLog(); userDao.add("test001", 20); // int i = 1 / 0;System.out.println("################");userDao.add("test002", 21);}public void del() {System.out.println("del");}} package com.learn;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.service.UserService;public class Test001 {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");UserService userService = (UserService) applicationContext.getBean("userServiceImpl");userService.add();}}?
總結(jié)
以上是生活随笔為你收集整理的Spring七中传播行为详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义注解简单实现
- 下一篇: SpringMVC中向服务器传输数据(解