<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Spring的事務控制可以分為程式設計式事務控制和宣告式事務控制。
程式設計式
開發者直接把事務的程式碼和業務程式碼耦合到一起,在實際開發中不用。
宣告式
開發者採用設定的方式來實現的事務控制,業務程式碼與事務程式碼實現解耦合,使用的AOP思想。
PlatformTransactionManager介面,是spring的事務管理器介面,裡面提供了我們常用的操作事務的方法。
TransactionDefinition介面提供事務的定義資訊(事務隔離級別、事務傳播行為等等)
(1)事務隔離級別
設定隔離級別,可以解決事務並行產生的問題,如髒讀、不可重複讀和虛讀(幻讀)。
注意:使用資料庫預設級別,如果資料庫是mysql,則預設是可重複讀,oracle是讀已提交。
ISOLATION_DEFAULT
使用資料庫預設級別
ISOLATION_READ_UNCOMMITTED
讀未提交
ISOLATION_READ_COMMITTED
讀已提交(可解決髒讀問題)
ISOLATION_REPEATABLE_READ
可重複讀 (可解決髒讀、不可重複讀)
ISOLATION_SERIALIZABLE
序列化
可解決:
(2)事務傳播行為
事務傳播行為指的就是當一個業務方法【被】另一個業務方法呼叫時,應該如何進行事務控制。
重點:
read-only
(是否唯讀):建議查詢時設定為唯讀timeout
(超時時間):預設值是-1,沒有超時限制。如果有,以秒為單位進行設定TransactionStatus 介面提供的是事務具體的執行狀態。
可以簡單的理解三者的關係:事務管理器通過讀取事務定義引數進行事務管理,然後會產生一系列的事務狀態。
Spring中的事務控制主要就是通過這三個API實現的
PlatformTransactionManager
負責事務的管理,它是個介面,其子類負責具體工作
TransactionDefinition
定義了事務的一些相關引數
TransactionStatus
代表事務執行的一個實時狀態
理解三者的關係:事務管理器通過讀取事務定義引數進行事務管理,然後會產生一系列的事務狀態。
在Spring組態檔中宣告式的處理事務來代替程式碼式的處理事務。底層採用AOP思想來實現。
宣告式事務控制明確事項:
核心業務程式碼(目標物件) (切入點是誰?)
事務增強程式碼(Spring已提供事務管理器))(通知是誰?)
切面設定(切面如何設定?)(切面 = 切入點 + 通知)
使用spring宣告式事務控制轉賬業務。
步驟:
1.引入tx名稱空間
2.事務管理器通知設定
3.事務管理器AOP設定
4.測試事務控制轉賬業務程式碼
<?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 ">
<!--事務管理器物件--> <!--<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>
當使用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
:是否唯讀步驟:
@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; } }
知識小結:
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45