亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Spring編程式和聲明式事務(wù)實例講解

lushan / 3329人閱讀

摘要:基于和命名空間的聲明式事務(wù)管理目前推薦的方式,其最大特點是與結(jié)合緊密,可以充分利用切點表達式的強大支持,使得管理事務(wù)更加靈活?;诘娜⒔夥绞綄⒙暶魇绞聞?wù)管理簡化到了極致。

Java面試通關(guān)手冊(Java學習指南):https://github.com/Snailclimb/Java_Guide

歷史回顧:
可能是最漂亮的Spring事務(wù)管理詳解

Spring事務(wù)管理
Spring支持兩種方式的事務(wù)管理:

編程式事務(wù)管理: 通過Transaction Template手動管理事務(wù),實際應(yīng)用中很少使用,

使用XML配置聲明式事務(wù): 推薦使用(代碼侵入性最?。?,實際是通過AOP實現(xiàn)

實現(xiàn)聲明式事務(wù)的四種方式:

基于 TransactionInterceptor 的聲明式事務(wù): Spring 聲明式事務(wù)的基礎(chǔ),通常也不建議使用這種方式,但是與前面一樣,了解這種方式對理解 Spring 聲明式事務(wù)有很大作用。

基于 TransactionProxyFactoryBean 的聲明式事務(wù): 第一種方式的改進版本,簡化的配置文件的書寫,這是 Spring 早期推薦的聲明式事務(wù)管理方式,但是在 Spring 2.0 中已經(jīng)不推薦了。

基于< tx> 和< aop>命名空間的聲明式事務(wù)管理: 目前推薦的方式,其最大特點是與 Spring AOP 結(jié)合緊密,可以充分利用切點表達式的強大支持,使得管理事務(wù)更加靈活。

基于 @Transactional 的全注解方式: 將聲明式事務(wù)管理簡化到了極致。開發(fā)人員只需在配置文件中加上一行啟用相關(guān)后處理 Bean 的配置,然后在需要實施事務(wù)管理的方法或者類上使用 @Transactional 指定事務(wù)規(guī)則即可實現(xiàn)事務(wù)管理,而且功能也不必其他方式遜色。

我們今天要將的是使用編程式以及基于AspectJ的聲明式和基于注解的事務(wù)方式,實現(xiàn)爛大街的轉(zhuǎn)賬業(yè)務(wù)。

再來說一下這個案例的思想吧,我們在兩次轉(zhuǎn)賬之間添加一個錯誤語句(對應(yīng)銀行斷電等意外情況),如果這個時候兩次轉(zhuǎn)賬不能成功,則說明事務(wù)配置正確,否則,事務(wù)配置不正確。

你需要完成的任務(wù):

使用編程式事務(wù)管理完成轉(zhuǎn)賬業(yè)務(wù)

使用基于AspectJ的聲明式事務(wù)管理完成轉(zhuǎn)賬業(yè)務(wù)

使用基于 @Transactional 的全注解方式事務(wù)管理完成轉(zhuǎn)賬業(yè)務(wù)

備注:

下面的代碼是在很久之前,我剛學Sping還沒有接觸Maven的時候?qū)懙?,所以我使用的原始添加jar的方式,使用Maven的小伙伴可以自行添加Maven依賴,沒有使用Maven的小伙伴直接使用我下面提供的jar包即可。

jar包地址:鏈接:https://pan.baidu.com/s/1tqy-mVKxSutsIIvYgtC3Rw 密碼:nid0

項目結(jié)構(gòu):

開發(fā)工具:

Myeclipse2017

SQL:

create table `account` (
    `username` varchar (99),
    `salary` int (11)
); 
insert into `account` (`username`, `salary`) values("小王","3000");
insert into `account` (`username`, `salary`) values("小馬","3000");
(1)編程式事務(wù)管理

注意: 通過添加/刪除accountMoney() 方法中int i = 10 / 0這個語句便可驗證事務(wù)管理是否配置正確。

OrdersDao.java(Dao層)

package cn.itcast.dao;

import org.springframework.jdbc.core.JdbcTemplate;

public class OrdersDao {
    // 注入jdbcTemplate模板對象
    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    // 對數(shù)據(jù)操作的方法不包含業(yè)務(wù)操作
    /**
     * 小王少錢的方法
     */
    public void reduceMoney() {
        String sql = "update account set salary=salary-? where username=?";
        jdbcTemplate.update(sql, 1000, "小王");
    }

    /**
     * 小馬多錢的方法
     */
    public void addMoney() {
        String sql = "update account set salary=salary+? where username=?";
        jdbcTemplate.update(sql, 1000, "小馬");
    }
}

OrdersService.java(業(yè)務(wù)邏輯層)

package cn.itcast.service;

import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import cn.itcast.dao.OrdersDao;

public class OrdersService {
    // 注入Dao層對象
    private OrdersDao ordersDao;

    public void setOrdersDao(OrdersDao ordersDao) {
        this.ordersDao = ordersDao;
    }

    // 注入TransactionTemplate對象
    private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

    // 調(diào)用dao的方法
    // 業(yè)務(wù)邏輯,寫轉(zhuǎn)賬業(yè)務(wù)
    public void accountMoney() {
        transactionTemplate.execute(new TransactionCallback() {

            @Override
            public Object doInTransaction(TransactionStatus status) {
                Object result = null;
                try {
                    // 小馬多1000
                    ordersDao.addMoney();
                    // 加入出現(xiàn)異常如下面int
                    // i=10/0(銀行中可能為突然停電等。。。);結(jié)果:小馬賬戶多了1000而小王賬戶沒有少錢
                    // 解決辦法是出現(xiàn)異常后進行事務(wù)回滾
                    int i = 10 / 0;// 事務(wù)管理配置后異常已經(jīng)解決
                    // 小王 少1000
                    ordersDao.reduceMoney();
                } catch (Exception e) {
                    status.setRollbackOnly();
                    result = false;
                    System.out.println("Transfer Error!");
                }

                return result;
            }
        });

    }
}

TestService.java(測試方法)

package cn.itcast.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestService {
    @Test
    public void testAdd() {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "beans.xml");
        OrdersService userService = (OrdersService) context
                .getBean("ordersService");
        userService.accountMoney();
    }
}

配置文件:



    
    
        
        
        
        
        
    
    
    
    
        
        
    

    
    
        
        
    

    
    
        
        
        
    

    
        
    
    
    
        
    
 
(2)基于AspectJ的聲明式事務(wù)管理

OrdersService.java(業(yè)務(wù)邏輯層)

package cn.itcast.service;

import cn.itcast.dao.OrdersDao;

public class OrdersService {
    private OrdersDao ordersDao;

    public void setOrdersDao(OrdersDao ordersDao) {
        this.ordersDao = ordersDao;
    }

    // 調(diào)用dao的方法
    // 業(yè)務(wù)邏輯,寫轉(zhuǎn)賬業(yè)務(wù)
    public void accountMoney() {
        // 小馬多1000
        ordersDao.addMoney();
        // 加入出現(xiàn)異常如下面int i=10/0(銀行中可能為突然停電等。。。);結(jié)果:小馬賬戶多了1000而小王賬戶沒有少錢
        // 解決辦法是出現(xiàn)異常后進行事務(wù)回滾
        int i = 10 / 0;// 事務(wù)管理配置后異常已經(jīng)解決
        // 小王 少1000
        ordersDao.reduceMoney();
    }
}

配置文件:

    
    
        
        
        
        
        
    
    
    
        
        
    

    
    
        
        
            
            
            
            
        
    

    
    
        
        
        
        
    


    
    
        
    
    
        
    
    
        
    
(3)基于注解的方式

OrdersService.java(業(yè)務(wù)邏輯層)

package cn.itcast.service;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.dao.OrdersDao;

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = -1)
public class OrdersService {
    private OrdersDao ordersDao;

    public void setOrdersDao(OrdersDao ordersDao) {
        this.ordersDao = ordersDao;
    }

    // 調(diào)用dao的方法
    // 業(yè)務(wù)邏輯,寫轉(zhuǎn)賬業(yè)務(wù)
    public void accountMoney() {
        // 小馬多1000
        ordersDao.addMoney();
        // 加入出現(xiàn)異常如下面int i=10/0(銀行中可能為突然停電等。。。);結(jié)果:小馬賬戶多了1000而小王賬戶沒有少錢
        // 解決辦法是出現(xiàn)異常后進行事務(wù)回滾
        // int i = 10 / 0;// 事務(wù)管理配置后異常已經(jīng)解決
        // 小王 少1000
        ordersDao.reduceMoney();
    }
}

配置文件:

    
    
        
        
        
        
        
    
    
    
        
        
    
    
    
    
    
    
    
    
        
    
    
        
    
    
        
    

歡迎關(guān)注我的微信公眾號: "Java面試通關(guān)手冊" (一個有溫度的微信公眾號,期待與你共同進步~~~堅持原創(chuàng),分享美文,分享各種Java學習資源):

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69495.html

相關(guān)文章

  • MyBatis集成Spring

    摘要:各方面有各種常見的良好示例,包括日志記錄,聲明式事務(wù),安全性,緩存等。聲明式事務(wù)管理這意味著你從業(yè)務(wù)代碼中分離事務(wù)管理。但作為一種橫切關(guān)注點,聲明式事務(wù)管理可以使用方法進行模塊化。支持使用框架的聲明式事務(wù)管理。 本章主要內(nèi)容包括Spring簡介、Spring的兩大特性(IOC和AOP)、事務(wù)MyBatis集成Spring等。也許有讀者會疑惑,明明是MyBatis-Plus實戰(zhàn),怎么還講...

    ckllj 評論0 收藏0
  • Spring知識——事務(wù)解析

    摘要:編程式事務(wù)指的是通過編碼方式實現(xiàn)事務(wù)聲明式事務(wù)基于將具體業(yè)務(wù)邏輯與事務(wù)處理解耦。聲明式事務(wù)管理使業(yè)務(wù)代碼邏輯不受污染因此在實際使用中聲明式事務(wù)用的比較多。聲明式事務(wù)有兩種方式,一種是在配置文件中做相關(guān)的事務(wù)規(guī)則聲明,另一種是基于注解的方式。 事務(wù)管理是應(yīng)用系統(tǒng)開發(fā)中必不可少的一部分。Spring 為事務(wù)管理提供了豐富的功能支持。Spring 事務(wù)管理分為編碼式和聲明式的兩種方式。編程式...

    tuomao 評論0 收藏0
  • 可能是最漂亮的Spring事務(wù)管理詳解

    摘要:事務(wù)隔離級別定義了一個事務(wù)可能受其他并發(fā)事務(wù)影響的程度我們先來看一下并發(fā)事務(wù)帶來的問題,然后再來介紹一下接口中定義了五個表示隔離級別的常量。 Java面試通關(guān)手冊(Java學習指南):https://github.com/Snailclimb/Java_Guide 微信閱讀地址鏈接:可能是最漂亮的Spring事務(wù)管理詳解 事務(wù)概念回顧 什么是事務(wù)? 事務(wù)是邏輯上的一組操作,要么都執(zhí)行,...

    鄒立鵬 評論0 收藏0
  • <spring 3.x企業(yè)應(yīng)用開發(fā)實戰(zhàn)>讀書筆記-基于注解和聲明式的aop

    摘要:配置切面編程方式實現(xiàn)說結(jié)賬說要點什么注解表示前置增強后面的切點表達式表示在目標類的方法織入增強,方法可以帶任意的傳入?yún)?shù)和任意的返回值。類相當于上一篇中的增強切點,切面三者聯(lián)合表達的信息。 @AspectJ配置切面 編程方式實現(xiàn) public class Waiter { public void check(String name){ System.out.pr...

    馬龍駒 評論0 收藏0
  • Vue-router基本學習(1)

    摘要:單頁面應(yīng)用網(wǎng)頁只有在第一次進入頁面的的時候請求服務(wù)器的文件,接下來的頁面跳轉(zhuǎn)是基于內(nèi)部的。單頁面應(yīng)用第一次要將所有的資源全部加載,所以首屏時間慢,但是后續(xù)的跳轉(zhuǎn)不需要再次向服務(wù)器發(fā)請求。 多頁面應(yīng)用:網(wǎng)頁HTML文件是請求后臺發(fā)過來的。每次切換頁面都會從后臺把頁面文件傳輸回來。單頁面應(yīng)用:網(wǎng)頁只有在第一次進入頁面的、的時候請求服務(wù)器的HTML文件,接下來的頁面跳轉(zhuǎn)是基于內(nèi)部的route...

    IamDLY 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<