广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Framework @Tr
  • 534
分享到

Spring Framework @Tr

SpringFrameworkTr 2023-01-31 06:01:13 534人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

转自:Http://blog.163.com/sir_876/blog/static/1170522320106259562270/ 清单 1. 使用 JDBC 的简单数据库插入 view plaincopy to clipboar

转自:Http://blog.163.com/sir_876/blog/static/1170522320106259562270/

清单 1. 使用 JDBC 的简单数据库插入

view plaincopy to clipboardprint?
@Stateless
public class TradingServiceImpl implements TradingService {  
   @Resource SessionContext ctx;  
   @Resource(mappedName="java:jdbc/tradingDS") DataSource ds;  

   public long insertTrade(TradeData trade) throws Exception {  
      Connection dbConnection = ds.getConnection();  
      try {  
         Statement sql = dbConnection.createStatement();  
         String stmt =  
            "INSERT INTO TRADE (ACCT_ID, SIDE, SYMBOL, SHARES, PRICE, STATE)"
          + "VALUES ("
          + trade.getAcct() + "','"
          + trade.getAction() + "','"
          + trade.getSymbol() + "',"
          + trade.getShares() + ","
          + trade.getPrice() + ",'"
          + trade.getState() + "')";  
         sql.executeUpdate(stmt, Statement.RETURN_GENERATED_KEYS);  
         ResultSet rs = sql.getGeneratedKeys();  
         if (rs.next()) {  
            return rs.getBigDecimal(1).longValue();  
         } else {  
            throw new Exception("Trade Order Insert Failed");  
         }  
      } finally {  
         if (dbConnection != null) dbConnection.close();  
      }  
   }  
}
@Stateless
public class TradingServiceImpl implements TradingService {
   @Resource SessionContext ctx;
   @Resource(mappedName="java:jdbc/tradingDS") DataSource ds;
public long insertTrade(TradeData trade) throws Exception {
      Connection dbConnection = ds.getConnection();
      try {
         Statement sql = dbConnection.createStatement();
         String stmt =
            "INSERT INTO TRADE (ACCT_ID, SIDE, SYMBOL, SHARES, PRICE, STATE)"
          + "VALUES ("
          + trade.getAcct() + "','"
          + trade.getAction() + "','"
          + trade.getSymbol() + "',"
          + trade.getShares() + ","
          + trade.getPrice() + ",'"
          + trade.getState() + "')";
         sql.executeUpdate(stmt, Statement.RETURN_GENERATED_KEYS);
         ResultSet rs = sql.getGeneratedKeys();
         if (rs.next()) {
            return rs.getBigDecimal(1).longValue();
         } else {
            throw new Exception("Trade Order Insert Failed");
         }
      } finally {
         if (dbConnection != null) dbConnection.close();
      }
   }
}

清单 1 中的 JDBC 代码没有包含任何事务逻辑,它只是在数据库中保存 TRADE 表中的交易订单。在本例中,数据库处理事务逻辑。

在 LUW 中,这是一个不错的单个数据库维护操作。但是如果需要在向数据库插入交易订单的同时更新帐户余款呢?如清单 2 所示:


清单 2. 在同一方法中执行多次表更新

view plaincopy to clipboardprint?
public TradeData placeTrade(TradeData trade) throws Exception {  
   try {  
      insertTrade(trade);  
      updateAcct(trade);  
      return trade;  
   } catch (Exception up) {  
      //log the error  
      throw up;  
   }  
}
public TradeData placeTrade(TradeData trade) throws Exception {
   try {
      insertTrade(trade);
      updateAcct(trade);
      return trade;
   } catch (Exception up) {
      //log the error
      throw up;
   }
}

在本例中,insertTrade() 和 updateAcct() 方法使用不带事务的标准 JDBC 代码。insertTrade() 方法结束后,数据库保存(并提交了)交易订单。如果 updateAcct() 方法由于任意原因失败,交易订单仍然会在 placeTrade() 方法结束时保存在 TRADE 表内,这会导致数据库出现不一致的数据。如果 placeTrade() 方法使用了事务,这两个活动都会包含在一个 LUW 中,如果帐户更新失败,交易订单就会回滚。

清单 4. 使用 @Transactional 注释

view plaincopy to clipboardprint?
public class TradingServiceImpl {  
   @PersistenceContext(unitName="trading") EntityManager em;  

   @Transactional
   public long insertTrade(TradeData trade) throws Exception {  
      em.persist(trade);  
      return trade.getTradeId();  
   }  
}
public class TradingServiceImpl {
   @PersistenceContext(unitName="trading") EntityManager em;

   @Transactional
   public long insertTrade(TradeData trade) throws Exception {
      em.persist(trade);
      return trade.getTradeId();
   }
}

现在重新测试代码,您发现上述方法仍然不能工作。问题在于您必须告诉 spring Framework,您正在对事务管理应用注释。除非您进行充分的单元测试,否则有时候很难发现这个陷阱。这通常只会导致开发人员在 Spring 配置文件中简单地添加事务逻辑,而不会使用注释。

要在 Spring 中使用 @Transactional 注释,必须在 Spring 配置文件中添加以下代码行:

view plaincopy to clipboardprint?
<tx:annotation-driven transaction-manager="transactionManager"/>
<tx:annotation-driven transaction-manager="transactionManager"/>

transaction-manager 属性保存一个对在 Spring 配置文件中定义的事务管理器 bean 的引用。这段代码告诉 Spring 在应用事务拦截器时使用 @Transaction 注释。如果没有它,就会忽略 @Transactional 注释,导致代码不会使用任何事务。

让基本的 @Transactional 注释在 清单 4 的代码中工作仅仅是开始。注意,清单 4 使用 @Transactional 注释时没有指定任何额外的注释参数。我发现许多开发人员在使用 @Transactional 注释时并没有花时间理解它的作用。例如,像我一样在清单 4 中单独使用 @Transactional 注释时,事务传播模式被设置成什么呢?只读标志被设置成什么呢?事务隔离级别的设置是怎样的?更重要的是,事务应何时回滚工作?理解如何使用这个注释对于 确保在应用程序中获得合适的事务支持级别非常重要。回答我刚才提出的问题:在单独使用不带任何参数的 @Transactional 注释时,传播模式要设置为 REQUIRED,只读标志设置为 false,事务隔离级别设置为 READ_COMMITTED,而且事务不会针对受控异常(checked exception)回滚。

@Transactional 只读标志陷阱

我在工作中经常碰到的一个常见陷阱是 Spring @Transactional 注释中的只读标志没有得到恰当使用。这里有一个快速测试方法:在使用标准 JDBC 代码获得 Java 持久性时,如果只读标志设置为 true,传播模式设置为 SUPPORTS,清单 5 中的 @Transactional 注释的作用是什么呢?


清单 5. 将只读标志与 SUPPORTS 传播模式结合使用 — JDBC

view plaincopy to clipboardprint?
@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)  
public long insertTrade(TradeData trade) throws Exception {  
   //JDBC Code...  
}
@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public long insertTrade(TradeData trade) throws Exception {
   //JDBC Code...
}

当执行清单 5 中的 insertTrade() 方法时,猜一猜会得到下面哪一种结果:
抛出一个只读连接异常
正确插入交易订单并提交数据
什么也不做,因为传播级别被设置为 SUPPORTS
是哪一个呢?正确答案是 B。交易订单会被正确地插入到数据库中,即使只读标志被设置为 true,且事务传播模式被设置为 SUPPORTS。但这是如何做到的呢?由于传播模式被设置为 SUPPORTS,所以不会启动任何事物,因此该方法有效地利用了一个本地(数据库)事务。只读标志只在事务启动时应用。在本例中,因为没有启动任何事 务,所以只读标志被忽略。

--结束END--

本文标题: Spring Framework @Tr

本文链接: https://www.lsjlt.com/news/189752.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Framework @Tr
    转自:http://blog.163.com/sir_876/blog/static/1170522320106259562270/ 清单 1. 使用 JDBC 的简单数据库插入 view plaincopy to clipboar...
    99+
    2023-01-31
    Spring Framework Tr
  • Spring Framework有哪些优点
    Spring Framework有以下优点:1. 轻量级:Spring是一个轻量级的框架,不需要很多资源和依赖。2. 松耦合:Spr...
    99+
    2023-09-27
    Spring
  • spring framework源码调试技巧
    目录1. 获取spring-framework源码2. 导入到IDEA2.1 预编译spring-oxm2.2 导入到Idea3 添加用于测试的SpringMVC项目Module3....
    99+
    2022-11-12
    spring framework源码 spring framework源码调试
  • Spring Framework 3.0.7有哪些改进
    小编给大家分享一下Spring Framework 3.0.7有哪些改进,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Spring Framework 3.0.7 发布了,可通过 Maven 中心 SpringSource...
    99+
    2023-06-17
  • Spring Framework源代码环境搭建
    概要本文介绍使用IntelliJ IDEA搭建Spring Framework源代码环境,用于源代码阅读与debug。环境搭建1.下载源代码访问Spring Framework在GitHub的地址,下载最新源代码。本人在下载时,版本号为5....
    99+
    2023-06-02
  • Vue3+Spring Framework框架怎么开发
    本篇内容主要讲解“Vue3+Spring Framework框架怎么开发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3+Spring Framework框架怎么开发”...
    99+
    2023-07-06
  • jquery 追加tr和删除tr示例代码
    复制代码 代码如下: <script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>...
    99+
    2022-11-15
    jquery 追加tr 删除tr
  • jquery如何去掉tr
    这篇文章主要介绍了jquery如何去掉tr,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 jquery去掉tr的...
    99+
    2022-10-19
    jquery tr
  • Android Framework Application Framework层简单介绍
    引言               Andro...
    99+
    2022-06-06
    framework Android
  • 如何在 Linux 上使用 Bash 和 PHP 进行 Spring Framework 开发?
    在Linux环境下使用Bash和PHP进行Spring Framework开发是一个非常有趣的话题。在本文中,我们将探讨如何使用这些工具来开发高质量的Spring应用程序。 首先,我们需要安装必要的工具。在Linux环境下,我们可以使用包管...
    99+
    2023-07-30
    spring bash linux
  • Linux tr命令的使用
    1.简介 tr用来转换或者删除一段文字。tr是translate(转换的缩写),功能的英文示意是:translate or delete characters。tr所有的功能均可由sed来完成,可以将tr视为sed一...
    99+
    2022-06-03
    Linux tr Linux tr命令
  • html隐藏tr的方法
    这篇文章给大家分享的是有关html隐藏tr的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。html隐藏tr的方法:首先创建一个HTML示例文件;然后通过tr标签定义HTML表格中的行;最后通过“<tr ...
    99+
    2023-06-14
  • tr命令如何使用
    今天小编给大家分享一下tr命令如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。通过使用tr,您可以非常容易地实现 se...
    99+
    2023-06-27
  • 【framework】spring3-m
    前言 spring一直以来提供了大量文档和例子,来让我们熟悉和了解spring. springMVC是一个比较成功的MVC模式,有人甚至认为这是java最好的web开发模式。 这个,我们不评价,不过这也能说明一些问题。 自spring3加入...
    99+
    2023-01-31
    framework
  • 【framework】spring3-入
    补充:我把相关jar包上传到 http://down.51cto.com/data/477540   spring3发布有相当长一段时间了,因为待业在家,一直帮朋友提供些方案,没有太多关注。...
    99+
    2023-01-31
    framework
  • jquery如何修改tr的类
    这篇文章主要介绍“jquery如何修改tr的类”,在日常操作中,相信很多人在jquery如何修改tr的类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jquery如何修改tr...
    99+
    2022-10-19
    jquery
  • javascript如何删除tr元素
    这篇文章主要介绍“javascript如何删除tr元素”,在日常操作中,相信很多人在javascript如何删除tr元素问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java...
    99+
    2022-10-19
    javascript
  • jquery怎么增加一行tr
    本篇内容介绍了“jquery怎么增加一行tr”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
    jquery
  • jquery如何隐藏table的tr
    这篇文章主要介绍“jquery如何隐藏table的tr”,在日常操作中,相信很多人在jquery如何隐藏table的tr问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jque...
    99+
    2022-10-19
    jquery
  • jquery如何隐藏tr一行
    本篇内容介绍了“jquery如何隐藏tr一行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
    jquery
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作