±à¼ÍƼö: |
±¾ÎÄÖ÷ҪʹÓÃתÕ˰¸ÀýÏêϸÃèÊöÁËSpringµÄ
ÊÂÎñ¹ÜÀí£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚCSDN £¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
1.1 »Ø¹ËÊÂÎñ
1.ÊÂÎñ£ºÒ»×éÒµÎñ²Ù×÷ABCD£¬ÒªÃ´È«²¿³É¹¦£¬ÒªÃ´È«²¿²»³É¹¦¡£
2.ÌØÐÔ£ºACID
Ô×ÓÐÔ£ºÕûÌå
Ò»ÖÂÐÔ£ºÍê³É
¸ôÀëÐÔ£º²¢·¢
³Ö¾ÃÐÔ£º½á¹û
3.¸ôÀëÎÊÌ⣺
Ôà¶Á£ºÒ»¸öÊÂÎñ¶Áµ½ÁíÒ»¸öÊÂÎñûÓÐÌá½»µÄÊý¾Ý
²»¿ÉÖØ¸´¶Á£ºÒ»¸öÊÂÎñ¶Áµ½ÁíÒ»¸öÊÂÎñÒÑÌá½»µÄÊý¾Ý£¨update£©
Ðé¶Á(»Ã¶Á)£ºÒ»¸öÊÂÎñ¶Áµ½ÁíÒ»¸öÊÂÎñÒÑÌá½»µÄÊý¾Ý£¨insert£©
4.¸ôÀë¼¶±ð£º
read uncommitted£º¶ÁδÌá½»¡£´æÔÚ3¸öÎÊÌâ
read committed£º¶ÁÒÑÌá½»¡£½â¾öÔà¶Á£¬´æÔÚ2¸öÎÊÌâ
repeatable read£º¿ÉÖØ¸´¶Á¡£½â¾ö£ºÔà¶Á¡¢²»¿ÉÖØ¸´¶Á£¬´æÔÚ1¸öÎÊÌâ¡£
serializable £º´®Ðл¯¡£¶¼½â¾ö£¬µ¥ÊÂÎñ¡£

mysql ÊÂÎñ²Ù×÷¨C¼òµ¥
ABCD Ò»¸öÊÂÎñ
Connection conn = null;
try{
//1 »ñµÃÁ¬½Ó
conn = ...;
//2 ¿ªÆôÊÂÎñ
conn.setAutoCommit(false);
A
B
C
D
//3 Ìá½»ÊÂÎñ
conn.commit();
} catche(){
//4 »Ø¹öÊÂÎñ
conn.rollback();
} |
mysql ÊÂÎñ²Ù×÷¨CSavepoint
ÐèÇó£ºAB£¨±ØÐ룩£¬CD£¨¿ÉÑ¡£©
Connection conn = null;
Savepoint savepoint = null; //±£´æµã£¬¼Ç¼²Ù×÷µÄµ±Ç°Î»Ö㬠֮ºó¿ÉÒԻعöµ½Ö¸¶¨µÄλÖᣣ¨¿ÉÒԻعöÒ»²¿·Ö£©
try{
//1 »ñµÃÁ¬½Ó
conn = ...;
//2 ¿ªÆôÊÂÎñ
conn.setAutoCommit(false);
A
B
savepoint = conn.setSavepoint();
C
D
//3 Ìá½»ÊÂÎñ
conn.commit();
} catche(){
if(savepoint != null){ //CDÒì³£
// »Ø¹öµ½CD֮ǰ
conn.rollback(savepoint);
// Ìá½»AB
conn.commit();
} else{ //ABÒì³£
// »Ø¹öAB
conn.rollback();
}
} |
1.2ÊÂÎñ¹ÜÀí½éÉÜ
1.2.1µ¼Èëjar°ü
transaction ¨C> tx

1.2.2Èý¸ö¶¥¼¶½Ó¿Ú

1.PlatformTransactionManager ƽ̨ÊÂÎñ¹ÜÀíÆ÷£¬springÒª¹ÜÀíÊÂÎñ£¬±ØÐëʹÓÃÊÂÎñ¹ÜÀíÆ÷
½øÐÐÊÂÎñÅäÖÃʱ£¬±ØÐëÅäÖÃÊÂÎñ¹ÜÀíÆ÷¡£
2.TransactionDefinition£ºÊÂÎñÏêÇ飨ÊÂÎñ¶¨Òå¡¢ÊÂÎñÊôÐÔ£©£¬springÓÃÓÚÈ·¶¨ÊÂÎñ¾ßÌåÏêÇ飬
ÀýÈ磺¸ôÀë¼¶±ð¡¢ÊÇ·ñÖ»¶Á¡¢³¬Ê±Ê±¼ä µÈ
½øÐÐÊÂÎñÅäÖÃʱ£¬**±ØÐëÅäÖÃÏêÇé¡£**spring½«ÅäÖÃÏî·â×°µ½¸Ã¶ÔÏóʵÀý¡£
3.TransactionStatus£ºÊÂÎñ״̬£¬springÓÃÓڼǼµ±Ç°ÊÂÎñÔËÐÐ״̬¡£ÀýÈ磺ÊÇ·ñÓб£´æµã£¬ÊÂÎñÊÇ·ñÍê³É¡£
springµ×²ã¸ù¾Ý״̬½øÐÐÏàÓ¦²Ù×÷¡£
1.2.3PlatformTransactionManager ÊÂÎñ¹ÜÀíÆ÷
1.µ¼Èëjar°ü£ºÐèҪʱƽ̨ÊÂÎñ¹ÜÀíÆ÷µÄʵÏÖÀà

2.³£¼ûµÄÊÂÎñ¹ÜÀíÆ÷
DataSourceTransactionManager £¬jdbc¿ª·¢Ê±ÊÂÎñ¹ÜÀíÆ÷£¬²ÉÓÃJdbcTemplate
HibernateTransactionManager£¬hibernate¿ª·¢Ê±ÊÂÎñ¹ÜÀíÆ÷£¬ÕûºÏhibernate

1.apiÏê½â
TransactionStatus getTransaction(TransactionDefinition
definition) £¬ÊÂÎñ¹ÜÀíÆ÷ ͨ¹ý¡°ÊÂÎñÏêÇ顱£¬»ñµÃ¡°ÊÂÎñ״̬¡±£¬´Ó¶ø¹ÜÀíÊÂÎñ¡£
void commit(TransactionStatus status) ¸ù¾Ý״̬Ìá½»
void rollback(TransactionStatus status) ¸ù¾Ý״̬»Ø¹ö
1.2.4TransactionStatus

1.2.5TransactionDefinition

´«²¥ÐÐΪ£ºÔÚÁ½¸öÒµÎñÖ®¼äÈçºÎ¹²ÏíÊÂÎñ¡£
PROPAGATION_REQUIRED , required , ±ØÐë ¡¾Ä¬ÈÏÖµ¡¿
Ö§³Öµ±Ç°ÊÂÎñ£¬AÈç¹ûÓÐÊÂÎñ£¬B½«Ê¹ÓøÃÊÂÎñ¡£
Èç¹ûAûÓÐÊÂÎñ£¬B½«´´½¨Ò»¸öеÄÊÂÎñ¡£
PROPAGATION_SUPPORTS £¬supports £¬Ö§³Ö
Ö§³Öµ±Ç°ÊÂÎñ£¬AÈç¹ûÓÐÊÂÎñ£¬B½«Ê¹ÓøÃÊÂÎñ¡£
Èç¹ûAûÓÐÊÂÎñ£¬B½«ÒÔ·ÇÊÂÎñÖ´ÐС£
PROPAGATION_MANDATORY£¬mandatory £¬Ç¿ÖÆ
Ö§³Öµ±Ç°ÊÂÎñ£¬AÈç¹ûÓÐÊÂÎñ£¬B½«Ê¹ÓøÃÊÂÎñ¡£
Èç¹ûAûÓÐÊÂÎñ£¬B½«Å×Òì³£¡£
PROPAGATION_REQUIRES_NEW £¬ requires_new £¬±ØÐëеÄ
Èç¹ûAÓÐÊÂÎñ£¬½«AµÄÊÂÎñ¹ÒÆð£¬B´´½¨Ò»¸öеÄÊÂÎñ
Èç¹ûAûÓÐÊÂÎñ£¬B´´½¨Ò»¸öеÄÊÂÎñ
PROPAGATION_NOT_SUPPORTED £¬not_supported ,²»Ö§³Ö
Èç¹ûAÓÐÊÂÎñ£¬½«AµÄÊÂÎñ¹ÒÆð£¬B½«ÒÔ·ÇÊÂÎñÖ´ÐÐ
Èç¹ûAûÓÐÊÂÎñ£¬B½«ÒÔ·ÇÊÂÎñÖ´ÐÐ
PROPAGATION_NEVER £¬never£¬´Ó²»
Èç¹ûAÓÐÊÂÎñ£¬B½«Å×Òì³£
Èç¹ûAûÓÐÊÂÎñ£¬B½«ÒÔ·ÇÊÂÎñÖ´ÐÐ
PROPAGATION_NESTED £¬nested £¬Ç¶Ì×
AºÍBµ×²ã²ÉÓñ£´æµã»úÖÆ£¬ÐγÉǶÌ×ÊÂÎñ¡£
ÕÆÎÕ£ºPROPAGATION_REQUIRED¡¢PROPAGATION_REQUIRES_NEW¡¢PROPAGATION_NESTED
°¸Àý£º×ªÕË °¸Àý£º×ªÕË
2.3.1´î½¨»·¾³
´´½¨±í
create database
ee19_spring_day03;
use ee19_spring_day03;
create table account(
id int primary key auto_increment,
username varchar(50),
money int
);
insert into account(username,money) values('jack','10000');
insert into account(username,money) values('rose','10000');
|
1.3.1.2µ¼Èëjar°ü
1.ºËÐÄ£º4+1
2.aop £º 4 (aopÁªÃË¡¢spring aop¡¢aspectj¹æ·¶¡¢spring aspect)
3.Êý¾Ý¿â£º2 £¨jdbc/tx£©
4.Çý¶¯£ºmysql
5.Á¬½Ó³Ø£ºc3p0

2.3.1.3dao²ã
public class
AccountDaoImpl extends JdbcDaoSupport implements
AccountDao {
@Override
public void out(String outer, Integer money)
{
this.getJdbcTemplate().update("update account
set money = money - ? where username = ?",
money,outer);
} @Override
public void in(String inner, Integer money)
{
this.getJdbcTemplate().update("update account
set money = money + ? where username = ?",
money,inner);
} } |
2.3.1.4service²ã
public class
AccountServiceImpl implements AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao)
{
this.accountDao = accountDao;
}
@Override
public void transfer(String outer, String inner,
Integer money) {
accountDao.out(outer, money);
//¶Ïµç
// int i = 1/0;
accountDao.in(inner, money);
} } |
2.3.1.5springÅäÖÃ
<!-- 1 datasource
--> <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/ee19_spring_day03"></property>
<property name="user" value="root"></property>
<property name="password" value="1234"></property>
</bean>
<!-- 2 dao -->
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 3 service -->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
</bean> |
2.3.1.6²âÊÔ
@Test
public void demo01(){
String xmlPath = "applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
AccountService accountService = (AccountService)
applicationContext.getBean("accountService");
accountService.transfer("jack", "rose",
1000);
} |
2.3.3¹¤³§bean Éú³É´úÀí£º°ë×Ô¶¯
springÌṩ ¹ÜÀíÊÂÎñµÄ´úÀí¹¤³§bean TransactionProxyFactoryBean
1.getBean() »ñµÃ´úÀí¶ÔÏó
2.spring ÅäÖÃÒ»¸ö´úÀí
2.3.3.1springÅäÖÃ
<!-- 4 service
´úÀí¶ÔÏó
4.1 proxyInterfaces ½Ó¿Ú
4.2 target Ä¿±êÀà
4.3 transactionManager ÊÂÎñ¹ÜÀíÆ÷
4.4 transactionAttributes ÊÂÎñÊôÐÔ£¨ÊÂÎñÏêÇ飩
prop.key £ºÈ·¶¨ÄÄЩ·½·¨Ê¹Óõ±Ç°ÊÂÎñÅäÖÃ
prop.text:ÓÃÓÚÅäÖÃÊÂÎñÏêÇé
¸ñʽ£ºPROPAGATION,ISOLATION,readOnly,-Exception,+Exception
´«²¥ÐÐΪ ¸ôÀë¼¶±ð ÊÇ·ñÖ»¶Á Òì³£»Ø¹ö Òì³£Ìá½»
ÀýÈ磺 <prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT< /prop>
ĬÈÏ´«²¥ÐÐΪ£¬ºÍ¸ôÀë¼¶±ð <prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT, readOnly</prop>
Ö»¶Á <prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT, +java.lang. ArithmeticException</prop>
ÓÐÒì³£ÈÓÌá½»
--> <bean id="proxyAccountService"
class="org.springframework. transaction.interceptor. TransactionProxyFactoryBean">
<property name="proxyInterfaces"
value="com.itheima.service. AccountService">< /property>
<property name="target" ref="accountService"></property>
<property name="transactionManager"
ref="txManager"></property>
<property name="transactionAttributes">
<props> <prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT</prop>
</props> </property> </bean>
<!-- 5 ÊÂÎñ¹ÜÀíÆ÷ -->
<bean id="txManager" class="org.springframework.jdbc.datasource. DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> |
2.3.3.2²âÊÔ

2.3.4AOP ÅäÖûùÓÚxml¡¾ÕÆÎÕ¡¿
2.3.4AOP ÅäÖûùÓÚxml¡¾ÕÆÎÕ¡¿
ÔÚspring xml ÅäÖÃaop ×Ô¶¯Éú³É´úÀí£¬½øÐÐÊÂÎñµÄ¹ÜÀí
1.ÅäÖùÜÀíÆ÷
2.ÅäÖÃÊÂÎñÏêÇé
3.ÅäÖÃaop
<!-- 4 ÊÂÎñ¹ÜÀí
--> <!-- 4.1 ÊÂÎñ¹ÜÀíÆ÷ --> <bean
id="txManager" class="org.springframework.jdbc.datasource. DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 4.2 ÊÂÎñÏêÇ飨ÊÂÎñ֪ͨ£© £¬ ÔÚaopɸѡ»ù´¡ÉÏ£¬ ¶ÔABCÈý¸öÈ·¶¨Ê¹ÓÃʲôÑùµÄÊÂÎñ¡£ÀýÈ磺AC¶Áд¡¢BÖ»¶Á
µÈ <tx:attributes> ÓÃÓÚÅäÖÃÊÂÎñÏêÇ飨ÊôÐÔÊôÐÔ£©
<tx:method name=""/> ÏêÇé¾ßÌåÅäÖÃ
propagation ´«²¥ÐÐΪ £¬ REQUIRED£º±ØÐ룻REQUIRES_NEW: ±ØÐëÊÇеÄ
isolation ¸ôÀë¼¶±ð
--> <tx:advice id="txAdvice"
transaction-manager="txManager">
<tx:attributes> <tx:method name="transfer"
propagation="REQUIRED" isolation="DEFAULT"/>
</tx:attributes> </tx:advice>
<!-- 4.3 AOP±à³Ì£¬Ä¿±êÀàÓÐABCD£¨4¸öÁ¬½Óµã£©£¬ ÇÐÈëµã±í´ïʽ È·¶¨ÔöÇ¿µÄÁ¬½ÓÆ÷£¬´Ó¶ø»ñµÃÇÐÈëµã£ºABC
--> <aop:config> <aop:advisor
advice-ref="txAdvice" pointcut="execution(*
com.itheima.service..*.*(..))"/> </aop:config>
|
2.3.5AOPÅäÖûùÓÚ×¢½â¡¾ÕÆÎÕ¡¿
2.3.5AOPÅäÖûùÓÚ×¢½â¡¾ÕÆÎÕ¡¿
2.3.5AOPÅäÖûùÓÚ×¢½â¡¾ÕÆÎÕ¡¿
1.ÅäÖÃÊÂÎñ¹ÜÀíÆ÷£¬½«²¢ÊÂÎñ¹ÜÀíÆ÷½»Óèspring
2.ÔÚÄ¿±êÀà»òÄ¿±ê·½·¨Ìí¼Ó×¢½â¼´¿É @Transactional
2.3.5.1springÅäÖÃ
<!-- 4 ÊÂÎñ¹ÜÀí
--> <!-- 4.1 ÊÂÎñ¹ÜÀíÆ÷ --> <bean
id="txManager" class="org.springframework.jdbc.datasource. DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 4.2 ½«¹ÜÀíÆ÷½»Óèspring
* transaction-manager ÅäÖÃÊÂÎñ¹ÜÀíÆ÷
* proxy-target-class
true £º µ×²ãÇ¿ÖÆÊ¹ÓÃcglib ´úÀí
--> <tx:annotation-driven transaction-manager="txManager"/>
|
2.3.5.2service ²ã
@Transactional
public class AccountServiceImpl implements AccountService
{ |
2.3.5.3ÊÂÎñÏêÇéÅäÖÃ

@Transactional(propagation=Propagation. REQUIRED
, isolation = Isolation.DEFAULT)
public class AccountServiceImpl implements AccountService
{ |
|