【spring事務管理】
一、事務的作用
將若干的資料庫操作作為一個整體控制,一起成功或一起失敗。原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
一致性:指事務前後資料的完整性必須保持一致。
隔離性:指多個使用者併發訪問資料庫時,一個使用者的事務不能被其他使用者的事務所幹擾,多個併發事務之間資料要相互隔離。
永續性:指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,即時資料庫發生故障也不應該對其有任何影響。
二、Spring事務管理高層抽象主要包括3個介面
–Platform TransactionManager 事務管理器(提交、回滾事務)Spring為不同的持久化框架提供了不同的Platform TransactionManager介面實現。如:
使用Spring JDBC或iBatis進行持久化資料時使用DataSourceTransactionManager
使用Hibernate3.0版本進行持久化資料時使用HibernateTransactionManager
–TransactionDefinition
髒讀:一個事務讀取了另一個事務改寫但還未提交的資料,如果這些資料被回滾,則讀到的資料是無效的。
不可重複讀:在同一事務中,多次讀取同一資料返回的結果有所不同。
幻讀:一個事務讀取了幾行記錄後,另一個事務插入一些記錄,幻讀就發生了。再後來的查詢中,第一個事務就會發現有些原來沒有的記錄。
事務隔離級別:(五種)
- DEFAULT–使用後端資料庫預設的隔離級別(Spring中的選擇項)
- READ_UNCOMMITED–允許你讀取還未提交的改變了的資料。可能導致髒、幻、不可重複讀
- READ_COMMITTED–允許在併發事務已經提交後讀取。可防止髒讀,但幻讀和不可重複讀仍可發生
- REPEATABLE_READ–對相同欄位的多次讀取是一致的,除非資料被事務本身改變。可防止髒、不可重複讀,但幻讀仍可能發生
- SERIALIZABLE–完全服從ACID的隔離級別,確保不發生髒、幻、不可重複讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的資料表來完成的
事務傳播行為:(七種)
- REQUIRED–支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
- SUPPORTS–支援當前事務,如果當前沒有事務,就以非事務方式執行。
- MANDATORY–支援當前事務,如果當前沒有事務,就丟擲異常。
- REQUIRES_NEW–新建事務,如果當前存在事務,把當前事務掛起。
- NOT_SUPPORTED–以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
- NEVER–以非事務方式執行,如果當前存在事務,則丟擲異常。
- NESTED–如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則進行與REQUIRED類似的操作。擁有多個可以回滾的儲存點,內部回滾不會對外部事務產生影響。只對DataSourceTransactionManager有效
三、Spring提供了以下方法控制事務
a.程式設計式事務管理(基於Java程式設計控制,很少使用)–見demo1包利用TransactionTemplate將多個DAO操作封裝起來
*b.宣告式事務管理(基於Spring的AOP配置控制)
-基於TransactionProxyFactoryBean的方式.(很少使用)–見demo2包
需要為每個進行事務管理的類,配置一個TransactionProxyFactoryBean進行增強.
-基於XML配置(經常使用)–見demo3包
一旦配置好之後,類上不需要新增任何東西。
如果Action作為目標物件切入事務,需要在<aop:config>元素裡新增proxy-target-class=”true”屬性。原因是通知Spring框架採用CGLIB技術生成具有事務管理功能的Action類。
-基於註解(配置簡單,經常使用)–見demo4包
在applicationContext.xml中開啟事務註解配置。(applicationContext.xml中只需定義Bean並追加以下元素)
<bean id=”txManager” class=”…”>
<property name=”sessionFactory”>
</property>
<tx:annotation-driven transaction-manager=”txManager”/>
在目標元件類中使用@Transactional,該標記可定義在類前或方法前。
四、示例(銀行轉賬)
–程式設計式
[java] view plain copy print?- /**
- * @Description:轉賬案例的DAO層介面
- *
- */
- publicinterface AccountDao {
- /**
- * @param out
- * :轉出賬號
- * @param money
- * :轉賬金額
- */
- publicvoid outMoney(String out, Double money);
- /**
- *
- * @param in
- * :轉入賬號
- * @param money
- * :轉賬金額
- */
- publicvoid inMoney(String in, Double money);
- }
/**
* @Description:轉賬案例的DAO層介面
*
*/
public interface AccountDao {
/**
* @param out
* :轉出賬號
* @param money
* :轉賬金額
*/
public void outMoney(String out, Double money);
/**
*
* @param in
* :轉入賬號
* @param money
* :轉賬金額
*/
public void inMoney(String in, Double money);
}
[java] view plain copy print?
- /**
- * @Description:轉賬案例的DAO層實現類
- */
- publicclass AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
- /**
- * @param out
- * :轉出賬號
- * @param money
- * :轉賬金額
- */
- @Override
- publicvoid outMoney(String out, Double money) {
- String sql = ”update account set money = money-? where name = ?”;
- this.getJdbcTemplate().update(sql, money, out);
- }
- /**
- * @param in
- * :轉入賬號
- * @param money
- * :轉賬金額
- */
- @Override
- publicvoid inMoney(String in, Double money) {
- String sql = ”update account set money = money+? where name = ?”;
- this.getJdbcTemplate().update(sql, money, in);
- }
- }
/**
* @Description:轉賬案例的DAO層實現類
*/
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
/**
* @param out
* :轉出賬號
* @param money
* :轉賬金額
*/
@Override
public void outMoney(String out, Double money) {
String sql = "update account set money = money-? where name = ?";
this.getJdbcTemplate().update(sql, money, out);
}
/**
* @param in
* :轉入賬號
* @param money
* :轉賬金額
*/
@Override
public void inMoney(String in, Double money) {
String sql = "update account set money = money+? where name = ?";
this.getJdbcTemplate().update(sql, money, in);
}
}
[java] view plain copy print?
- /**
- * @Description:轉賬案例的業務介面
- *
- */
- publicinterface AccountService {
- /**
- * @param out :轉出賬號
- * @param in :轉入賬號
- * @param money :轉賬金額
- */
- publicvoid transfer(String out,String in,Double money);
- }
/**
* @Description:轉賬案例的業務介面
*
*/
public interface AccountService {
/**
* @param out :轉出賬號
* @param in :轉入賬號
* @param money :轉賬金額
*/
public void transfer(String out,String in,Double money);
}
[java] view plain copy print?
- /**
- * @Description:轉賬案例的業務層實現類
- */
- publicclass AccountServiceImpl implements AccountService {
- // 注入轉賬的DAO
- private AccountDao accountDao;
- // 注入事務管理的模板
- private TransactionTemplate transactionTemplate;
- /**
- * @param out
- * :轉出賬號
- * @param in
- * :轉入賬號
- * @param money
- * :轉賬金額
- */
- @Override
- publicvoid transfer(final String out, final String in, final Double money) {
- // 未經事務控制的業務處理操作,如果過程中出異常,則導致前面的操作能完成,後面的不能,即轉賬成功但未收到轉賬款
- // accountDao.outMoney(out, money);
- // int i = 1/0;
- // accountDao.inMoney(in, money);
- transactionTemplate.execute(new TransactionCallbackWithoutResult() {
- @Override
- protectedvoid doInTransactionWithoutResult(
- TransactionStatus transactionStatus) {
- accountDao.outMoney(out, money);
- // int i = 1 / 0;//事務控制,即出現異常,該段內程式碼都執行失效
- accountDao.inMoney(in, money);
- }
- });
- }
- publicvoid setAccountDao(AccountDao accountDao) {
- this.accountDao = accountDao;
- }
- publicvoid setTransactionTemplate(TransactionTemplate transactionTemplate) {
- this.transactionTemplate = transactionTemplate;
- }
- }
/**
* @Description:轉賬案例的業務層實現類
*/
public class AccountServiceImpl implements AccountService {
// 注入轉賬的DAO
private AccountDao accountDao;
// 注入事務管理的模板
private TransactionTemplate transactionTemplate;
/**
* @param out
* :轉出賬號
* @param in
* :轉入賬號
* @param money
* :轉賬金額
*/
@Override
public void transfer(final String out, final String in, final Double money) {
// 未經事務控制的業務處理操作,如果過程中出異常,則導致前面的操作能完成,後面的不能,即轉賬成功但未收到轉賬款
// accountDao.outMoney(out, money);
// int i = 1/0;
// accountDao.inMoney(in, money);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(
TransactionStatus transactionStatus) {
accountDao.outMoney(out, money);
// int i = 1 / 0;//事務控制,即出現異常,該段內程式碼都執行失效
accountDao.inMoney(in, money);
}
});
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
}
applicationContext1.xml [html] view plain copy print?
- <!– 引入外部的屬性檔案 –>
- <context:property-placeholderlocation=“classpath:jdbc.properties”/>
- <!– 配置c3p0連線池 –>
- <beanid=“dataSource”class=“com.mchange.v2.c3p0.ComboPooledDataSource”>
- <propertyname=“driverClass”value=“{jdbc.driverClass}"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"jdbcUrl"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.url}”/>
- <propertyname=“user”value=“{jdbc.username}"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.password}”/>
- </bean>
- <!– 配置業務層類 –>
- <beanid=“accountService”class=“com.zs.spring.demo1.AccountServiceImpl”>
- <propertyname=“accountDao”ref=“accountDao”/>
- <!– 注入事務管理的模板 –>
- <propertyname=“transactionTemplate”ref=“transactionTemplate”/>
- </bean>
- <!– 配置DAO類(簡化,會自動配置JdbcTemplate) –>
- <beanid=“accountDao”class=“com.zs.spring.demo1.AccountDaoImpl”>
- <propertyname=“dataSource”ref=“dataSource”/>
- </bean>
- <!– 配置DAO類(未簡化) –>
- <!– <beanid=“jdbcTemplate”class=“org.springframework.jdbc.core.JdbcTemplate”>
- <propertyname=“dataSource”ref=“dataSource”/>
- </bean>
- <beanid=“accountDao”class=“com.zs.spring.demo1.AccountDaoImpl”>
- <propertyname=“jdbcTemplate”ref=“jdbcTemplate”/>
- </bean> –>
- <!– ==================================1.程式設計式的事務管理=============================================== –>
- <!– 配置事務管理器 –>
- <beanid=“transactionManager”class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
- <propertyname=“dataSource”ref=“dataSource”/>
- </bean>
- <!– 配置事務管理的模板:Spring為了簡化事務管理的程式碼而提供的類 –>
- <beanid=“transactionTemplate”class=“org.springframework.transaction.support.TransactionTemplate”>
- <propertyname=“transactionManager”ref=“transactionManager”/>
- </bean>
<!-- 引入外部的屬性檔案 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置c3p0連線池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置業務層類 -->
<bean id="accountService" class="com.zs.spring.demo1.AccountServiceImpl">
<property name="accountDao" ref="accountDao" />
<!-- 注入事務管理的模板 -->
<property name="transactionTemplate" ref="transactionTemplate" />
</bean>
<!-- 配置DAO類(簡化,會自動配置JdbcTemplate) -->
<bean id="accountDao" class="com.zs.spring.demo1.AccountDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置DAO類(未簡化) -->
<!-- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="accountDao" class="com.zs.spring.demo1.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean> -->
<!-- ==================================1.程式設計式的事務管理=============================================== -->
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事務管理的模板:Spring為了簡化事務管理的程式碼而提供的類 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
測試: [java] view plain copy print?
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(“classpath:applicationContext1.xml”)
- publicclass TransactionTest {
- @Resource(name = “accountService”)
- private AccountService accountService;
- @Test
- publicvoid demo1() {
- accountService.transfer(”aaa”, “bbb”, 200d);
- }
- }
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext1.xml")
public class TransactionTest {
@Resource(name = "accountService")
private AccountService accountService;
@Test
public void demo1() {
accountService.transfer("aaa", "bbb", 200d);
}
}
–基於TransactionProxyFactoryBean的方式
[java] view plain copy print?
- publicclass AccountServiceImpl implements AccountService {
- // 注入轉賬的DAO
- private AccountDao accountDao;
- /**
- * @param out
- * :轉出賬號
- * @param in
- * :轉入賬號
- * @param money
- * :轉賬金額
- */
- @Override
- publicvoid transfer(String out, String in, Double money) {
- accountDao.outMoney(out, money);
- // int i = 1/0;
- accountDao.inMoney(in, money);
- }
- publicvoid setAccountDao(AccountDao accountDao) {
- this.accountDao = accountDao;
- }
- }
public class AccountServiceImpl implements AccountService {
// 注入轉賬的DAO
private AccountDao accountDao;
/**
* @param out
* :轉出賬號
* @param in
* :轉入賬號
* @param money
* :轉賬金額
*/
@Override
public void transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
// int i = 1/0;
accountDao.inMoney(in, money);
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
}
applicationContext2.xml
[html] view plain copy print?
- <!– 引入外部的屬性檔案 –>
- <context:property-placeholderlocation=“classpath:jdbc.properties”/>
- <!– 配置c3p0連線池 –>
- <beanid=“dataSource”class=“com.mchange.v2.c3p0.ComboPooledDataSource”>
- <propertyname=“driverClass”value=“{jdbc.driverClass}"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"jdbcUrl"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.url}”/>
- <propertyname=“user”value=“{jdbc.username}"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{jdbc.password}”/>
- </bean>
- <!– 配置業務層類 –>
- <beanid=“accountService”class=“com.zs.spring.demo2.AccountServiceImpl”>
- <propertyname=“accountDao”ref=“accountDao”/>
- </bean>
- <!– 配置DAO類(簡化,會自動配置JdbcTemplate) –>
- <beanid=“accountDao”class=“com.zs.spring.demo2.AccountDaoImpl”>
- <propertyname=“dataSource”ref=“dataSource”/>
- </bean>
- <!– ==================================2.使用XML配置宣告式的事務管理(原始方式)=============================================== –>
- <!– 配置事務管理器 –>
- <beanid=“transactionManager”class=“org.springframework.jdbc.datasource.DataSourceTransactionManager”>
- <propertyname=“dataSource”ref=“dataSource”/>
- </bean>
- <!– 配置業務層的代理 –>
- <beanid=“accountServiceProxy”class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>
- <!– 配置目標物件 –>
- <propertyname=“target”ref=“accountService”/>
- <!– 注入事務管理器 –>
- <propertyname=“transactionManager”ref=“transactionManager”></property>
- <!– 注入事務的屬性 –>
- <propertyname=“transactionAttributes”>
- <props>
- <!–
- prop的格式:
- * PROPAGATION :事務的傳播行為
- * ISOTATION :事務的隔離級別
- * readOnly :只讀
- * -EXCEPTION :發生哪些異常回滾事務
- * +EXCEPTION :發生哪些異常不回滾事務
- –>
- <propkey=“transfer”>PROPAGATION_REQUIRED</prop>
- <!– <prop key=”transfer”>PROPAGATION_REQUIRED,readOnly</prop> –>
- <!– <prop key=”transfer”>PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> –>
- </props>
- </property>
- </bean>
<!-- 引入外部的屬性檔案 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置c3p0連線池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置業務層類 -->
<bean id="accountService" class="com.zs.spring.demo2.AccountServiceImpl">
<property name="accountDao" ref="accountDao" />
</bean>
<!-- 配置DAO類(簡化,會自動配置JdbcTemplate) -->
<bean id="accountDao" class="com.zs.spring.demo2.AccountDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ==================================2.使用XML配置宣告式的事務管理(原始方式)=============================================== -->
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置業務層的代理 -->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 配置目標物件 -->
<property name="target" ref="accountService" />
<!-- 注入事務管理器 -->
<property name="transactionManager" ref="transactionManager"></property>
<!-- 注入事務的屬性 -->
<property name="transactionAttributes">
<props>
<!--
prop的格式:
* PROPAGATION :事務的傳播行為
* ISOTATION :事務的隔離級別
* readOnly :只讀
* -EXCEPTION :發生哪些異常回滾事務
* +EXCEPTION :發生哪些異常不回滾事務
-->
<prop key="transfer">PROPAGATION_REQUIRED</prop>
<!-- <prop key="transfer">PROPAGATION_REQUIRED,readOnly</prop> -->
<!-- <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> -->
</props>
</property>
</bean>
測試: [java] view plain copy print?
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(“classpath:applicationContext2.xml”)
- publicclass TransactionTest {
- /**
- * 一定要注入代理類:因為代理類進行增強的操作
- */
- // @Resource(name=”accountService”)
- @Resource(name = “accountServiceProxy”)
- private AccountService accountService;
- @Test
- publicvoid demo1() {
- accountService.transfer(”aaa”, “bbb”, 200d);
- }
- }
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class TransactionTest {
/**
* 一定要注入代理類:因為代理類進行增強的操作
*/
// @Resource(name="accountService")
@Resource(name = "accountServiceProxy")
private AccountService accountService;
@Test
public void demo1() {
accountService.transfer("aaa", "bbb", 200d);
}
}
–基於XML配置 [java] view plain copy print?
- publicclass AccountServiceImpl implements AccountService {
- // 注入轉賬的DAO
- private AccountDao accountDao;
- /**
- * @param out
- * :轉出賬號
- * @param in
- * :轉入賬號
- * @param money
- * :轉賬金額
- */
- @Override
- publicvoid transfer(String out, String in, Double money) {
- accountDao.outMoney(out, money);
- // int i = 1/0;
- accountDao.inMoney(in, money);
- }
- publicvoid setAccountDao(AccountDao accountDao) {
- this.accountDao = accountDao;
- }
- }
public class AccountServiceImpl implements AccountService {
// 注入轉賬的DAO
private AccountDao accountDao;
/**
* @param out
* :轉出賬號
* @param in
* :轉入賬號
* @param money
* :轉賬金額
*/
@Override
public void transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
// int i = 1/0;
accountDao.inMoney(in, money);
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
}
applicationContext3.xml
[html] view plain copy print?
-
相關推薦
【spring事務管理】
一、事務的作用 將若干的資料庫操作作為一個整體控制,一起成功或一起失敗。 原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 一致性:指事務前後資料的完整性必須保持一致。 隔離性:指多個使用者併發訪問資料庫時,一個使用者的事務不能被其他使用者的事務所幹擾,多個
Spring事務管理Transaction【轉】
集成 class advice nag batis spring3 ont weblogic tex Spring提供了許多內置事務管理器實現(原文鏈接:https://www.cnblogs.com/qiqiweige/p/5000086.html): DataSo
【Spring實戰】----Spring事務管理配置解析
上篇說了aop的配置,並且說了Spring事務管理是基於aop的,那麼Spring宣告式事務的配置就有兩種方式:XML配置及註解配置不多說,直接看配置檔案一、配置檔案applicationContext-transaction.xml<?xml version="1.0
【面試】足夠“忽悠”面試官的『Spring事務管理器』原始碼閱讀梳理(建議珍藏)
PS:文章內容涉及原始碼,請耐心閱讀。 理論實踐,相輔相成 偉大領袖毛主席告訴我們實踐出真知。這是無比正確的。但是也會很辛苦。就像淘金一樣,從大量沙子中淘出金子一定是一個無比艱辛的過程。但如果真能淘出來,也一定是像金子一樣寶貴的東西。他老人家還說過,當真知上升為理論的時候
【Spring學習34】Spring事務(4):事務屬性之7種傳播行為
事務傳播行為 什麼叫事務傳播行為?聽起來挺高階的,其實很簡單。 即然是傳播,那麼至少有兩個東西,才可以發生傳播。單體不存在傳播這個行為。 事務傳播行為(propagation behavior)指的就是當一個事務方法被另一個事務方法呼叫時,這個事務方法應該
【Shiro許可權管理】3.Shiro整合 Spring
下面來說一下如何在Web下使用Shiro。 在大部分Web開發環境下,都是使用Spring與Shiro進行整合,所以下面直接來講解Shiro與Spring整合的方式。 一、準備環境 (1)加入Spring和Shiro的jar包 首先在MyEclipse中新建一個Web工程:
spring事務管理 TransactionProxyFactoryBean源碼分析
java 事務管理 J2EE,當然離不開事務,事務又當然少不了Spring聲明式事務。spring聲明式事務,很多碼農門,應該和筆者一樣,停留在使用上,及僅僅了解點原理。如:Spring事務管理原理“代理+AOP”,再深入了解就不太清楚了。一直對聲明式事務實現特別感興趣,今天抽時間,剖析一下下。1.準
Spring事務管理
classpath 依賴 font word .get 執行 pointcut str 攔截 1、導入jar包 spring核心包 commons-logging.jar spring-beans.jar spring-context.jar spring-core.jar
【SVN版本管理】
svn版本管理第1章 SVN希望大家可以一起學習,可以加筆者QQ864161921.1 SVN簡介SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統。Subversion管理著隨時間改變的數據。這些數據放置在一個中央資料檔案庫(repository)中。這個檔案庫很像一個普通的文件服務器,不過
Spring事務管理----------整合學習版
XML idt 類定義 dao mda info spring配置 讀取數據 blue 作者:學無先後 達者為先 Spring提供了一流的事務管理。在Spring中可以支持聲明式事務和編程式事務。 一 spring簡介 1 Spring的事務 事
spring事務管理,xml配置aop事務和註解配置aop事務
mov ref itcast template password nds eth poi ntc xml配置和註解配合共同代碼 AccountService.java public interface AccountService { //轉賬方法
spring 事務管理的簡單配置
ger string oot code nal chan 價格 nts 每次 1:事務的優點 事務管理對平時的業務邏輯的健壯性幫助很大,它保證了一個動作的原子性 本例中主要體現在,購票或者購書中,業務邏輯如下: 1:根據商品的ID查詢該商品的價格,
(轉)spring事務管理幾種方式
pac jpg gets point aos load man classpath XML 轉自:http://blog.csdn.net/jeamking/article/details/43982435 前段時間對Spring的事務配置做了比較深入的研究,在此之間對
Spring事務管理API
logs 技術 -1 blog 9.png src es2017 http .cn Spring事務管理API
【項目管理】經驗之談 | 資深項目經理都避免的5個坑,你中招了嗎?
尊重 最終 fail 同方 快速 這就是 tro 理解 動力 哈嘍!大家好! 那天看到最有趣的一句話就是 為了填坑,一位項目經理胖了20斤 。。。。。 今天就給大家介紹一下 項目經理要註意的那些“坑” 項目經理“誤踩雷區” 1 未告知成員工作目標 作為項目經理
spring事務管理aop
jdbc tran err att get ted cor cep pack 達內12 note unit 09 01 1.spring事務管理 2.spring提供了對事務管理支持 spring采用aop機制完成事務控制 可以實現在不修改原有組件代碼情況下實現事務控制功能
Java Spring-事務管理概述
dot nat 框架 3.0 信息 commit int 效率 cti 2017-11-11 23:05:39 事務(Transaction):是邏輯上一組操作,要麽全都成功,要麽全都失敗。 一、事務的特性 原子性:事務不可分割 一致性:事務執行的前後,數據完整性保持一致
Spring---AOP註解開發&jdbc模板&Spring事務管理
use oca update -m spl pub tex com att 一、AOP註解開發 此處需要回憶一遍AOP的概念。簡單的來說,AOP就是利用動態代理技術,做到不觸動源代碼但卻擴展了功能。那麽就需要一個被擴展的對象和一個“新的功能”,例如說給某類的saveUs
[Spring框架]Spring 事務管理基礎入門總結.
復制 tor junit4 dao img bubuko 說過 應該 pat 前言:在之前的博客中已經說過了數據庫的事務, 不過那裏面更多的是說明事務的一些鎖機制, 今天來說一下Spring管理事務的一些基礎知識. 之前的文章: [數據庫事務與鎖]詳解一: 徹底理解數據庫