Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
SpringµÄ ÊÂÎñ¹ÜÀí ÒÔ¼° תÕ˰¸Àý
 
×÷Õߣº CokeCode
  3368  次浏览      27
 2020-9-15
 
±à¼­ÍƼö:
±¾ÎÄÖ÷ҪʹÓÃתÕ˰¸ÀýÏêϸÃèÊöÁË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 {
 
   
3368 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
JavaÐéÄâ»ú¼Ü¹¹
JVM¡ª¡ªJavaÐéÄâ»ú¼Ü¹¹
JavaÈÝÆ÷Ïê½â
Java½ø½×--ÉîÈëÀí½âArrayListʵÏÖÔ­Àí
Java²¢·¢ÈÝÆ÷£¬µ×²ãÔ­ÀíÉîÈë·ÖÎö
×îпγÌ
java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
SpringBoot&Cloud¡¢JavaSSM¿ò¼Ü
Spring Boot Åàѵ
³É¹¦°¸Àý
¹úÄÚÖªÃûÒøÐÐ Spring+SpringBoot+Cloud+MVC
±±¾© Java±à³Ì»ù´¡ÓëÍøÒ³¿ª·¢»ù´¡
±±¾© Struts+Spring
»ªÏÄ»ù½ð ActiveMQ Ô­Àí
ijÃñº½¹« Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢