Spring的交易控制可以分為編程式交易控制和聲明式交易控制。
編程式
開發者直接把交易的程式碼和業務程式碼耦合到一起,在實際開發中不用。
聲明式
開發者採用配置的方式來實現的事務控制,業務代碼與事務代碼實現解耦合,使用的AOP思想。
PlatformTransactionManager接口,是spring的事務管理器接口,裡面提供了我們常用的操作事務的方法。
TransactionDefinition介面提供交易的定義資訊(交易隔離層級、交易傳播行為等等)
(1)交易隔離級別
#設定隔離級別,可以解決交易並發產生的問題,如髒讀、不可重複讀和虛讀(幻讀)。
注意:使用資料庫預設級別,如果資料庫是mysql,則預設是可重複讀,oracle是讀已提交。
ISOLATION_DEFAULT
使用資料庫預設等級
ISOLATION_READ_UNCOMMITTED
讀取未提交
#ISOLATION_READ_COMMITTED
已讀取已提交(
##ISOLATION_READ_COMMITTED #已提交(可解決髒讀問題)
ISOLATION_REPEATABLE_READ 可重複讀取(可解決髒讀、無法重複讀取)
ISOLATION_SERIALIZABLE
##ISOLATION_SERIALIZABLE 串列化
可解決:
(2)事務傳播行為事務傳播行為指的就是當一個業務方法【被】另一個業務方法呼叫時,應該如何進行事務控制。
read-only
timeout
(逾時時間):預設值為-1,沒有逾時限制。如果有,以秒為單位進行設定2.3 TransactionStatus
TransactionStatus 介面提供的是交易具體的運作狀態。
Spring中的事務控制主要是透過這三個API實現的
PlatformTransactionManager 負責事務的管理,它是個接口,其子類別負責具體工作
TransactionDefinition 定義了事務的一些相關參數TransactionStatus 代表交易運行的一個即時狀態
理解三者的關係:事務定義參數
進行事務管理,然後產生一系列的事務狀態。
3.基於XML的宣告式交易控制【重點】在Spring設定檔中宣告式的處理交易來取代程式碼式的處理交易。底層採用AOP思想來實現。宣告式交易控制明確事項:
核心業務程式碼(目標物件)(切入點是誰?)交易增強程式碼(Spring已提供事務管理器))(通知是誰?)切面配置(切面如何配置?)(切面= 切入點通知)
3.1快速入門##使用spring聲明式事務控制轉帳業務。
步驟:1.引入tx命名空間
(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)事務管理器通知配置 <!--事务管理器对象-->
<!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>-->
// 通知增强
<tx:advice id="txAdvice" transaction-manager="transactionManager">
//定义事务的一些属性 * 表示当前任意名称的方法都走默认配置
<!--
name: 切点方法名称
isolation:事务的隔离级别
propagation:事务的传播行为
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)事務管理器AOP設定
當使用spring宣告式管理事務,要使用aop:advisor來進行aop的設定!//aop配置:配置切面 <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.lagou.servlet.impl.AccountServiceImpl.*(..))"/> </aop:config>-->###交易參數的設定詳解:###############
name
:切点方法名称
isolation
:事务的隔离级别
propogation
:事务的传播行为
timeout
:超时时间
read-only
:是否只读
步骤:
修改service层,增加事务注解
修改spring核心配置文件,开启事务注解支持
@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); } }
<?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、组件扫描配置--> <!--事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--事务的注解支持--> <tx:annotation-driven/> </beans
核心配置类:
@Configuration // 声明该类为核心配置类 @ComponentScan("com.lagou") // 包扫描 @Import(DataSourceConfig.class) //导入其他配置类 @EnableTransactionManagement //事务的注解驱动 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; } }
数据源配置类:
@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; } }
以上是Java Spring的兩種事務是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!