1. Springä¸çäºå¡æ§å¶æ¹å¼
Springçäºå¡æ§å¶å¯ä»¥å为ç¼ç¨å¼äºå¡æ§å¶å声æå¼äºå¡æ§å¶ã
ç¼ç¨å¼
å¼åè ç´æ¥æäºå¡ç代ç åä¸å¡ä»£ç è¦åå°ä¸èµ·ï¼å¨å®é å¼åä¸ä¸ç¨ã
声æå¼
å¼åè éç¨é ç½®çæ¹å¼æ¥å®ç°çäºå¡æ§å¶ï¼ä¸å¡ä»£ç ä¸äºå¡ä»£ç å®ç°è§£è¦åï¼ä½¿ç¨çAOPææ³ã
2.ç¼ç¨å¼äºå¡æ§å¶ç¸å ³å¯¹è±¡
2.1PlatformTransactionManager
PlatformTransactionManageræ¥å£ï¼æ¯springçäºå¡ç®¡çå¨æ¥å£ï¼éé¢æä¾äºæ们常ç¨çæä½äºå¡çæ¹æ³ã
2.2TransactionDefinition
TransactionDefinitionæ¥å£æä¾äºå¡çå®ä¹ä¿¡æ¯ï¼äºå¡é离级å«ãäºå¡ä¼ æè¡ä¸ºççï¼
(1)äºå¡é离级å«
设置é离级å«ï¼å¯ä»¥è§£å³äºå¡å¹¶å产ççé®é¢ï¼å¦è读ãä¸å¯éå¤è¯»åè读ï¼å¹»è¯»ï¼ã
注æï¼ä½¿ç¨æ°æ®åºé»è®¤çº§å«ï¼å¦ææ°æ®åºæ¯mysql,åé»è®¤æ¯å¯éå¤è¯»ï¼oracleæ¯è¯»å·²æ交ã
ISOLATION_DEFAULT
使ç¨æ°æ®åºé»è®¤çº§å«
ISOLATION_READ_UNCOMMITTED
读æªæ交
ISOLATION_READ_COMMITTED
读已æ交ï¼å¯è§£å³è读é®é¢ï¼
ISOLATION_REPEATABLE_READ
å¯éå¤è¯» ï¼å¯è§£å³è读ãä¸å¯éå¤è¯»ï¼
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å½å空é´
2.äºå¡ç®¡çå¨éç¥é ç½®
3.äºå¡ç®¡çå¨AOPé ç½®
4.æµè¯äºå¡æ§å¶è½¬è´¦ä¸å¡ä»£ç
(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>-->
äºå¡åæ°çé 置详解:
<tx:method name=âtransferâ isolation=âREPEATABLE_READâ propagation=âREQUIREDâtimeout="-1" read-only=âfalseâ/>
name
ï¼åç¹æ¹æ³å称isolation
:äºå¡çé离级å«propogation
ï¼äºå¡çä¼ æè¡ä¸ºtimeout
ï¼è¶ æ¶æ¶é´read-only
ï¼æ¯å¦åªè¯»
4.åºäºæ³¨è§£ç声æå¼äºå¡æ§å¶ï¼éç¹ï¼
æ¥éª¤ï¼
ä¿®æ¹serviceå±ï¼å¢å äºå¡æ³¨è§£
ä¿®æ¹springæ ¸å¿é ç½®æ件ï¼å¼å¯äºå¡æ³¨è§£æ¯æ
4.1 ä¿®æ¹serviceå±ï¼å¢å äºå¡æ³¨è§£
@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æ ¸å¿é ç½®æ件ï¼å¼å¯äºå¡æ³¨è§£æ¯æ
<?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
4.3纯注解æ¹å¼
æ ¸å¿é 置类ï¼
@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; } }