Spring.Net学习笔记(7)-事务

一、开发环境

操作系统:Win7

编译器:VS2010

二、涉及程序集

Spring.Core.dll

Spring.Data.dll

Common.Logging.dll

三、开发过程

1.项目结构

2.IAccountDao.cs

namespace Dao
{
    public interface IAccountDao
    {
        void Create(string name, string userName);

        void Delete(string userName);
    }
}

3.IUserDao.cs

namespace Dao
{
    public interface IUserDao
    {
        void Create(string name, int age);

        void Delete(string name);

        DataSet Get(string name);
    }
}

4.AccountDao.cs

namespace Dao
{
    public class AccountDao : AdoDaoSupport, IAccountDao
    {
        public void Create(string name, string userName)
        {
            AdoTemplate.ExecuteNonQuery(CommandType.Text,
                String.Format("INSERT INTO T_Account (UserName,    AccountName) VALUES (‘{0}‘, ‘{1}‘)", userName, name));
        }

        public void Delete(string userName)
        {
            AdoTemplate.ExecuteNonQuery(CommandType.Text,
                String.Format("DELETE FROM T_Account WHERE UserName = ‘{0}‘", userName));
        }
    }
}

5.UserDao.cs

namespace Dao
{
    public class UserDao : AdoDaoSupport, IUserDao
    {
        public void Create(string name, int age)
        {
            AdoTemplate.ExecuteNonQuery(CommandType.Text,
                string.Format("INSERT INTO T_User (UserName,    UserAge) VALUES (‘{0}‘, {1})", name, age));
        }

        public void Delete(string name)
        {
            AdoTemplate.ExecuteNonQuery(CommandType.Text,
                string.Format("DELETE FROM T_User WHERE UserName = ‘{0}‘", name));
        }

        public DataSet Get(string name)
        {
            return AdoTemplate.DataSetCreate(CommandType.Text,
                string.Format("SELECT * FROM T_User WHERE UserName = ‘{0}‘", name));
        }
    }
}

6.IUserService.cs

namespace Service
{
    public interface IUserService
    {
        void SaveData(string name, int age, string accountName);

        void DeleteData(string name);

        DataSet Get(string name);
    }
}

7.UserService.cs

namespace Service
{
    public class UserService : IUserService
    {
        public IUserDao UserDao { get; set; }

        public IAccountDao AccountDao { get; set; }

        [Transaction]
        public void SaveData(string name, int age, string accountName)
        {
            UserDao.Create(name, age);
            AccountDao.Create(accountName, name);
        }

        [Transaction]
        public void DeleteData(string name)
        {
            UserDao.Delete(name);
            throw new Exception("测试数据是否回滚");
            AccountDao.Delete(name);
        }

        [Transaction(ReadOnly = true)]
        public DataSet Get(string name)
        {
            return UserDao.Get(name);
        }
    }
}

8.App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
      <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
    </sectionGroup>
  </configSections>

  <spring>
    <parsers>
      <parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
      <parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
    </parsers>

    <context>
      <!--<resource uri="assembly://Dao/Dao/Dao.xml"/>-->
      <resource uri="config://spring/objects"></resource>
    </context>

    <objects xmlns="http://www.springframework.net"
             xmlns:db="http://www.springframework.net/database"
             xmlns:tx="http://www.springframework.net/tx">

      <db:provider id="DbProvider"
                    provider="SqlServer-1.1"
                    connectionString="Server=(local);Database=CIS;Uid=sa;Pwd=woaini;Trusted_Connection=False"/>

      <object id="userDao" type="Dao.UserDao, Dao">
        <property name="AdoTemplate" ref="adoTemplate"/>
      </object>

      <object id="accountDao" type="Dao.AccountDao, Dao">
        <property name="AdoTemplate" ref="adoTemplate"/>
      </object>

      <object id="userService" type="Service.UserService, Service">
        <property name="UserDao" ref="userDao"/>
        <property name="AccountDao" ref="accountDao"/>
      </object>

      <object id="adoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
        <property name="DbProvider" ref="DbProvider"/>
        <property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
      </object>

      <!--事务管理器-->
      <object id="transactionManager"
             type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">
        <property name="DbProvider" ref="DbProvider"/>
      </object>

      <!--事务切面-->
      <tx:attribute-driven/>

    </objects>
  </spring>

</configuration>

9.控制台文件

namespace SpringNetTrans
{
    class Program
    {
        static void Main(string[] args)
        {
            AdoTransaction();
            Console.ReadKey();
        }

        public static void AdoTransaction()
        {
            IApplicationContext ctx = ContextRegistry.GetContext();
            IUserService service = (IUserService)ctx.GetObject("userService");
            service.SaveData("Kimisme", 27, "1233456");
        }

        public static void AdoDeleteTransaction()
        {
            IApplicationContext ctx = ContextRegistry.GetContext();
            IUserService service = (IUserService)ctx.GetObject("userService");
            service.DeleteData("Kimisme");
        }
    }
}

时间: 2024-10-11 07:52:21

Spring.Net学习笔记(7)-事务的相关文章

Spring MVC 学习笔记(二):@RequestMapping用法详解

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet>     <servlet-name>servletName</servlet-name>     <servlet-class>ServletClass</servlet-class> </servlet>

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

[Spring MVC]学习笔记--DispatcherServlet

在上一篇我们介绍了Servlet,这一篇主要来看一下MVC中用到的DispatcherServlet(继承自HttpServlet). 1. DispatcherServlet在web.xml中被声明. <web-app> <servlet> <servlet-name>example</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet&l

Spring MVC学习笔记(一)--------准备篇

这一系列笔记将带你一步一步的进入Spring MVC,高手勿喷. 首先你得安装以下的工具: JDK,虽然JDK8已经发布了一段时间了,但是由于我们并不会使用到里面的新特性,所以JDK6以上版本皆可以(需加入到PATH环境变量中): Servlet Container,为了能运行WEB应用程序,因此需要一个Web Container,这里我们建议Tomcat即可: IDE,一个好的IDE不仅能提高你开发的效率,还能降低你学习的成本,我们选择的是IntelliJ: 构建工具,推荐使用Gradle,它

[转]Spring MVC 学习笔记 json格式的输入和输出

Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.8.1</version>

Spring Batch学习笔记三:JobRepository

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用HSQLDB,也就是说在Job的运行过程中,所有的元数据都被储存在内存中,在Job结束后会随着进程的结束自动消失:在这里我们推荐配置JobRepository去使用MySQL. 在这种情况下,Spring Batch在单次执行或者从一个执行到另外一个执行的时候会使用数据库去维护状态,Job执行的信息包

Spring视频学习笔记(二)

Spring视频学习笔记(二) XML配置里的Bean自动装配(三个来测试实现) /** * Person类 * */ public class Person { private String name; private Address address; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Ad

[Spring MVC]学习笔记--基础Servlet

Servlet是一个用Java编写的应用程序,在服务器上运行,处理请求的信息并将其发送到客户端. Servlet的客户端提出请求并获得该请求的响应. 对于所有的客户端请求,只需要创建Servlet的实例一次(这是和CGI(Common Gateway Interface)的重要区别,CGI是每个请求创建一个新实例),因此节省了大量的内存. Servlet在初始化后即驻留内存中,因此每次作出请求时无需加载. 下面通过一个例子来介绍如何编写一个简单的Servlet. 准备工作: 1. 下载并启动To

Spring boot 学习笔记 (二)- 整合MyBatis

Spring boot 学习笔记 (二)- 整合MyBatis Spring Boot中整合MyBatis,并通过注解方式实现映射. 整合MyBatis 以Spring boot 学习笔记 (一)- Hello world 为基础项目,在pom.xml中添加如下依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter&l