日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手写spring编程事务

發(fā)布時間:2024/4/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手写spring编程事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用事務注意事項事務是程序運行如果沒有錯誤,會自動提交事物,如果程序運行發(fā)生異常,則會自動回滾。 如果使用了try捕獲異常時.一定要在catch里面手動回滾。 事務手動回滾代碼 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();聲明事務實現(xiàn) 概述 管理建立在AOP之上的。其本質(zhì)是對方法前后進行攔截,然后在目標方法開始之前創(chuàng)建或者加入一個事務, 在執(zhí)行完目標方法之后根據(jù)執(zhí)行情況提交或者回滾事務。聲明式事務最大的優(yōu)點就是不需要通過編程的方式管理事務, 這樣就不需要在業(yè)務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規(guī)則聲明 (或通過基于@Transactional注解的方式), 便可以將事務規(guī)則應用到業(yè)務邏輯中。顯然聲明式事務管理要優(yōu)于編程式事務管理,這正是spring倡導的非侵入式的開發(fā)方式。聲明式事務管理使業(yè)務代碼不受污染,一個普通的POJO對象,只要加上注解就可以獲得完全的事務支持。和編程式事務相比, 聲明式事務唯一不足地方是,后者的最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。 但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的代碼塊獨立為方法等等。 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/javassist/javassist --><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><!-- 引入Spring-AOP等相關Jar --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>3.0.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.0.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>3.0.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>3.0.6.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.6.1</version></dependency><dependency><groupId>aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.5.3</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.1_2</version></dependency><!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.37</version></dependency></dependencies></project> <?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 這里表示掃包范圍 因為我們是使用注解的,--><context:component-scan base-package="com.learn"></context:component-scan><!-- 這里表示開啟事務的注解 你如果想要事務的話,你必須開啟一個事務注解,--><aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!-- 開啟事物注解 --><!-- 1. 數(shù)據(jù)源對象: C3P0連接池 --><!-- 第一步我們加載C3P0數(shù)據(jù)源 DBCP和C3P0的區(qū)別講一下,數(shù)據(jù)庫的連接池,--><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/day20"></property><property name="user" value="root"></property><property name="password" value="123456"></property></bean><!-- 2. JdbcTemplate工具類實例 --><!-- 這里要引用到我的數(shù)據(jù)源 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 3.配置事務 --><bean id="dataSourceTransactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean> </beans> package com.learn.service;public interface UserService {public void add(); } package com.learn.service.impl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionStatus;import com.learn.dao.UserDao; import com.learn.service.UserService; import com.learn.transaction.TransactionUtils;/*** 這就是編程式事務* * @author Leon.Sun**/ @Service public class UserServiceImpl implements UserService {@Autowiredprivate TransactionUtils transactionUtils;@Autowiredprivate UserDao userDao;public void add() {/*** transactionStatus這樣起名還是規(guī)范一點* */TransactionStatus transactionStatus = null;/*** 這里一定要try起來* 事務沒問題才會提交* 有問題就會回滾* */try {/*** 開啟事務*/transactionStatus = transactionUtils.begin();userDao.add("test001", 20);/*** 這個時候test001會不會提交到數(shù)據(jù)庫里面去* 肯定不會的* 因為你的事務還沒有提交* 我怎么可能到數(shù)據(jù)庫里面查到呢* 是肯定不會到數(shù)據(jù)庫里面去的* 因為你沒有commit我怎么能到數(shù)據(jù)庫里面查的到呢* 肯定是不會的* 我們打個斷點看一下* 已經(jīng)走完了* 有沒有數(shù)據(jù)你們說* 是不是沒有* 因為你沒有提交到數(shù)據(jù)庫里面去* 報錯他就會走到catch里面去* 他就會把事務回滾* 數(shù)據(jù)庫里面是不是沒有* * 比如我們搞一個不報錯的* 我再運行一遍* 只要你不提交肯定是查不到的* 到這里是不是查不到* 當transactionUtils.commit(transactionStatus)這段代碼執(zhí)行完畢的情況下* 你這兩個數(shù)據(jù)都是可以查到的* 是不是提交了* 提交了之后test001和test002是不是都有了* 這就是事務的一個基本原理* 到時候我們結(jié)合AOP自己封裝一個事務* * */System.out.println("開始報錯了.........................."); // int i = 1/0;System.out.println("####################################");userDao.add("test002", 21);/*** 提交事務* transactionStatus!=null這個是為了安全起見*/if(transactionStatus!=null) { transactionUtils.commit(transactionStatus);}} catch (Exception e) {e.printStackTrace();/*** 異常我們最好這樣子做* 如果發(fā)生異常的情況下* 走到這里一定要調(diào)用rollback* 回滾事務* transactionStatus!=null這個是為了安全起見*/if(transactionStatus!=null) { transactionUtils.rollback(transactionStatus);}}} } package com.learn.transaction;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Component; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.interceptor.DefaultTransactionAttribute;/*** 我們今天講手寫事務* 我們要他的注解來實現(xiàn)事務* 注解其實都是封裝起來的* 通過編程事務進行封裝的* 編程事務(需要手動begin 手動回滾 手都提交)* 在這里我們要封裝幾個方法* 你們只要拿到ORM框架的接口就行了* 我們的數(shù)據(jù)源接口是哪一個* 就是dataSourceTransactionManager這個* 我們要拿到事務數(shù)據(jù)源* 然后進行控制事務* * 我們要把注入到Spring的容器里面去* 你們最好不要用單例的* 否則會產(chǎn)生線程安全問題的* * * * @author Leon.Sun**/ @Component public class TransactionUtils {/*** 獲取事務源* * 這里要注入一下@Autowired* */@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;/*** 這個方法干嘛用的* 是不是開啟事務* * * @return*/public TransactionStatus begin() {/*** 我們調(diào)用一下dataSourceTransactionManager* 我們先使用默認的傳播級別DefaultTransactionAttribute* 沒有學到傳播級別* 不知道他里面怎么去用* 拿到了事務的一個狀態(tài)* 記得要把事務的狀態(tài)返回回去* 這里是開啟一個事務* 我要提交事務怎么提交呢*/TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());return transaction;}/*** 這叫做提交事務* * 把狀態(tài)傳入進來* * * @param transaction*/public void commit(TransactionStatus transaction) {/*** 提價一個事務狀態(tài)* */dataSourceTransactionManager.commit(transaction);}/*** 我們再寫一個回滾事務* @param transaction*/public void rollback(TransactionStatus transaction) {dataSourceTransactionManager.rollback(transaction);} } package com.learn.test;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.service.UserService;public class Test001 {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");UserService userService = (UserService) applicationContext.getBean("userServiceImpl");userService.add();}}

?

總結(jié)

以上是生活随笔為你收集整理的手写spring编程事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。