Java?Spring的兩種事務(wù)你知道嗎
1. Spring中的事務(wù)控制方式
Spring的事務(wù)控制可以分為編程式事務(wù)控制和聲明式事務(wù)控制。
編程式
開發(fā)者直接把事務(wù)的代碼和業(yè)務(wù)代碼耦合到一起,在實際開發(fā)中不用。
聲明式
開發(fā)者采用配置的方式來實現(xiàn)的事務(wù)控制,業(yè)務(wù)代碼與事務(wù)代碼實現(xiàn)解耦合,使用的AOP思想。
2.編程式事務(wù)控制相關(guān)對象
2.1PlatformTransactionManager
PlatformTransactionManager接口,是spring的事務(wù)管理器接口,里面提供了我們常用的操作事務(wù)的方法。
2.2TransactionDefinition
TransactionDefinition接口提供事務(wù)的定義信息(事務(wù)隔離級別、事務(wù)傳播行為等等)
(1)事務(wù)隔離級別
設(shè)置隔離級別,可以解決事務(wù)并發(fā)產(chǎn)生的問題,如臟讀、不可重復(fù)讀和虛讀(幻讀)。
注意:使用數(shù)據(jù)庫默認級別,如果數(shù)據(jù)庫是mysql,則默認是可重復(fù)讀,oracle是讀已提交。
ISOLATION_DEFAULT
使用數(shù)據(jù)庫默認級別
ISOLATION_READ_UNCOMMITTED
讀未提交
ISOLATION_READ_COMMITTED
讀已提交(可解決臟讀問題)
ISOLATION_REPEATABLE_READ
可重復(fù)讀 (可解決臟讀、不可重復(fù)讀)
ISOLATION_SERIALIZABLE
串行化
可解決:
(2)事務(wù)傳播行為
事務(wù)傳播行為指的就是當一個業(yè)務(wù)方法【被】另一個業(yè)務(wù)方法調(diào)用時,應(yīng)該如何進行事務(wù)控制。
重點:
read-only
(是否只讀):建議查詢時設(shè)置為只讀timeout
(超時時間):默認值是-1,沒有超時限制。如果有,以秒為單位進行設(shè)置
2.3 TransactionStatus
TransactionStatus 接口提供的是事務(wù)具體的運行狀態(tài)。
可以簡單的理解三者的關(guān)系:事務(wù)管理器通過讀取事務(wù)定義參數(shù)進行事務(wù)管理,然后會產(chǎn)生一系列的事務(wù)狀態(tài)。
Spring中的事務(wù)控制主要就是通過這三個API實現(xiàn)的
PlatformTransactionManager
負責事務(wù)的管理,它是個接口,其子類負責具體工作
TransactionDefinition
定義了事務(wù)的一些相關(guān)參數(shù)
TransactionStatus
代表事務(wù)運行的一個實時狀態(tài)
理解三者的關(guān)系:事務(wù)管理器通過讀取事務(wù)定義參數(shù)進行事務(wù)管理,然后會產(chǎn)生一系列的事務(wù)狀態(tài)。
3.基于XML的聲明式事務(wù)控制【重點】
在Spring配置文件中聲明式的處理事務(wù)來代替代碼式的處理事務(wù)。底層采用AOP思想來實現(xiàn)。
聲明式事務(wù)控制明確事項:
核心業(yè)務(wù)代碼(目標對象) (切入點是誰?)
事務(wù)增強代碼(Spring已提供事務(wù)管理器))(通知是誰?)
切面配置(切面如何配置?)(切面 = 切入點 + 通知)
3.1快速入門
使用spring聲明式事務(wù)控制轉(zhuǎn)賬業(yè)務(wù)。
步驟:
1.引入tx命名空間
2.事務(wù)管理器通知配置
3.事務(wù)管理器AOP配置
4.測試事務(wù)控制轉(zhuǎn)賬業(yè)務(wù)代碼
(1)引入tx命名空間
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd ">
(2)事務(wù)管理器通知配置
<!--事務(wù)管理器對象--> <!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>--> // 通知增強 <tx:advice id="txAdvice" transaction-manager="transactionManager"> //定義事務(wù)的一些屬性 * 表示當前任意名稱的方法都走默認配置 <!-- name: 切點方法名稱 isolation:事務(wù)的隔離級別 propagation:事務(wù)的傳播行為 read-only:是否只讀 timeout:超時時間 --> <tx:attributes> <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/> //CRUD常用配置 <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice>
(3)事務(wù)管理器AOP配置
當使用spring聲明式管理事務(wù),要使用aop:advisor來進行aop的配置!
//aop配置:配置切面 <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lagou.servlet.impl.AccountServiceImpl.*(..))"/> </aop:config>-->
事務(wù)參數(shù)的配置詳解:
<tx:method name=“transfer” isolation=“REPEATABLE_READ” propagation=“REQUIRED”timeout="-1" read-only=“false”/>
name
:切點方法名稱isolation
:事務(wù)的隔離級別propogation
:事務(wù)的傳播行為timeout
:超時時間read-only
:是否只讀
4.基于注解的聲明式事務(wù)控制(重點)
步驟:
- 修改service層,增加事務(wù)注解
- 修改spring核心配置文件,開啟事務(wù)注解支持
4.1 修改service層,增加事務(wù)注解
@Service public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ, timeout = -1, readOnly = false) @Override public void transfer(String outUser, String inUser, Double money) { accountDao.out(outUser, money); int i = 1 / 0; accountDao.in(inUser, money); } }
4.2修改spring核心配置文件,開啟事務(wù)注解支持
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w2.org/2001/XMLSchema-instance" 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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--省略之前datsSource、jdbcTemplate、組件掃描配置--> <!--事務(wù)管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--事務(wù)的注解支持--> <tx:annotation-driven/> </beans
4.3純注解方式
核心配置類:
@Configuration // 聲明該類為核心配置類 @ComponentScan("com.lagou") // 包掃描 @Import(DataSourceConfig.class) //導(dǎo)入其他配置類 @EnableTransactionManagement //事務(wù)的注解驅(qū)動 public class SpringConfig { @Bean public JdbcTemplate getJdbcTemplate(@Autowired DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return jdbcTemplate; } @Bean public PlatformTransactionManager getPlatformTransactionManager(@Autowired DataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource); return dataSourceTransactionManager; } }
數(shù)據(jù)源配置類:
@PropertySource("classpath:jdbc.properties") //引入properties文件 public class DataSourceConfig { @Value("${jdbc.driverClassName}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean //會把當前方法的返回值對象放進IOC容器中 public DataSource getDataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(driver); druidDataSource.setUrl(url); druidDataSource.setUsername(username); druidDataSource.setPassword(password); return druidDataSource; } }
知識小結(jié):
- 平臺事務(wù)管理器配置(xml、注解方式)
- 事務(wù)通知的配置(@Transactional注解配置)
- 事務(wù)注解驅(qū)動的配置 <tx:annotation-driven/>、@EnableTransactionManagement
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java中的拷貝數(shù)組CopyOnWriteArrayList詳解
這篇文章主要介紹了Java中的拷貝數(shù)組CopyOnWriteArrayList詳解,ArrayList和LinkedList都不是線程安全的,如果需要線程安全的List,可以使用synchronizedList來生成一個同步list,但是這個同步list的方法都是通過synchronized修飾來保證同步的,需要的朋友可以參考下2023-12-12SpringBoot靜態(tài)資源css,js,img配置方案
這篇文章主要介紹了SpringBoot靜態(tài)資源css,js,img配置方案,下文給大家分享了三種解決方案,需要的朋友可以參考下2017-07-07springboot+springJdbc+postgresql 實現(xiàn)多數(shù)據(jù)源的配置
本文主要介紹了springboot+springJdbc+postgresql 實現(xiàn)多數(shù)據(jù)源的配置,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Java中提供synchronized后為什么還要提供Lock
這篇文章主要介紹了Java中提供synchronized后為什么還要提供Lock,在Java中提供了synchronized關(guān)鍵字來保證只有一個線程能夠訪問同步代碼塊,下文更多相關(guān)資料需要的小伙伴可以參考一下2022-03-03IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決
原來win10電腦上安裝的是jdk8的版本,因某些原因,現(xiàn)在想換成jdk7的版本,修改環(huán)境變量后,在cmd中執(zhí)行 [java -version]命令,顯示的是7的版本,遇到這樣的問題如何解決呢?下面小編給大家分享IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決方案,一起看看吧2023-09-09Idea?中控制啟動命令的詳細過程?區(qū)分環(huán)境案例詳解
這篇文章主要介紹了Idea?中控制啟動命令的詳細過程?區(qū)分環(huán)境案例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08