目录
Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(一)
Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(二)
Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(三)
Spring.Net+Nhibernate+ASP.MVC+EasyUI实践(四)
测试spring对事务管理的支持情况
| PROPAGATION_REQUIRED | 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 |
| PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
| PROPAGATION_MANDATORY | 支持当前事务,如果当前没有事务,就抛出异常。 |
| PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
| PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
| PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
| PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 |
Manager.xml中事物管理器的配置情况如下
<!--事物管理器-->
<object id="BaseTransactionManager" type="Spring.Transaction.Interceptor.TransactionProxyFactoryObject, Spring.Data" abstract="true">
<property name="PlatformTransactionManager" ref="transactionManager"/>
<property name="TransactionAttributes">
<name-values>
<!--增加-->
<add key="Save*" value="PROPAGATION_REQUIRED"/>
<!--修改-->
<add key="Update*" value="PROPAGATION_REQUIRED"/>
<!--删除-->
<add key="Delete*" value="PROPAGATION_REQUIRED"/>
<!--获取-->
<add key="Get*" value="PROPAGATION_REQUIRED"/>
<!--浏览-->
<add key="Find*" value="PROPAGATION_SUPPORTS,readOnly"/>
<!--检索-->
<add key="Search*" value="PROPAGATION_SUPPORTS,readOnly"/>
<!--报表-->
<add key="Query*" value="PROPAGATION_SUPPORTS,readOnly"/>
<!--载入-->
<add key="Load*" value="PROPAGATION_SUPPORTS,readOnly"/>
<!--报表-->
<add key="Report*" value="PROPAGATION_SUPPORTS,readOnly"/>
<!--其它-->
<add key="*" value="PROPAGATION_SUPPORTS"/>
<!--<add key="*" value="PROPAGATION_REQUIRED"/>-->
</name-values>
</property>
</object>
如果使用<add key="*" value="PROPAGATION_REQUIRED"/>,则注入了Target的Bll中不是上述save,deletee开头的方法都将以事务方式执行。
如果想单独对想对某一方法添加事务,则选择<add key="*" value="PROPAGATION_SUPPORTS"/>
然后在相应函数前面添加标记[Transaction],并在该项目中添加spring.data.Nhibernate32.dll
如在BLL的UserDepInfoManager.cs添加事务驱动的方法,当然IBLL中的接口也要相应修改
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FinanceWebSys.Model;
using FinanceWebSys.IBLL;
using Spring.Transaction.Interceptor;
namespace FinanceWebSys.BLL
{
public class UserDepInfoManager:GenericManager<UserDepInfo>,IUserDepInfoManager
{
public IList<UserDepInfo> LoadAllByPage(out long total, int page, int rows, string order, string sort)
{
return ((FinanceWebSys.IDao.IUserDepInfoRepository)(this.CurrentRepository)).LoadAllByPage(out total, page, rows, order, sort);
}
[Transaction]
public void CreateUser(UserDepInfo user)
{
((FinanceWebSys.IDao.IUserDepInfoRepository)(this.CurrentRepository)).Save(user);
if (user.DepID < 2)
{
throw new Exception("wrong");
}
}
}
}
HomeController做测试
public class HomeController : Controller
{
static log4net.ILog logger = log4net.LogManager.GetLogger("Logger");
public string Message { get; set; }
public IUserDepInfoManager UserDepInfoManager { get; set; }
public ActionResult Index()
{
var a = UserDepInfoManager.Get(1);
ViewBag.Message = a.DepName + a.Id;
try
{
log4net.Config.XmlConfigurator.Configure();
UserDepInfo user = new UserDepInfo { DepID = 1, DepName = "liuhuan" };
UserDepInfoManager.CreateUser(user);
}
catch (Exception ex)
{
logger.Error(ex);
throw ex;
}
return View();
}
Web.config配置添加
<configSections>
……
<sectionGroup name="spring">
……
<!--<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>-->
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<!--spring的配置文件-->
<spring>
<parsers>
<!--<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />-->
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data" />
</parsers>
……
</spring>
修改Manager.xml
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:db="http://www.springframework.net/database"
xmlns:tx="http://www.springframework.net/tx">
<object id="transactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
</object>
<!--事务切面-->
<tx:attribute-driven/>
完整版的web.config
<?xml version="1.0" encoding="utf-8"?>
<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!--spring对mvc的注入-->
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3" />
<!--<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>-->
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
</sectionGroup>
<!--log4net节点-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<!--数据库设置-->
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler" />
</configSections>
<!--spring的配置文件-->
<spring>
<parsers>
<!--<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />-->
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data" />
</parsers>
<context>
<!--Web-->
<resource uri="file://~/Configs/Controllers.xml" />
<!--BLL-->
<resource uri="file://~/Configs/Manager.xml" />
<!--Dao-->
<resource uri="file://~/Configs/Repository.xml" />
</context>
</spring>
<!--数据库连接字符串-->
<databaseSettings>
<add key="provider" value="Npgsql-2.0" />
<add key="connectionString" value="Server=127.0.0.1;Port=5432;User Id=postgres;Password=zllzh;Database=FinanceWebDb;" />
<add key="dialect" value="NHibernate.Dialect.PostgreSQLDialect" />
<add key="driver_class" value="NHibernate.Driver.NpgsqlDriver" />
<!--自动建表-->
<add key="hbm2ddl.auto" value="update" />
</databaseSettings>
<!--log4net-->
<log4net debug="true">
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="Logs\Log.log" />
<param name="datePattern" value="MM-dd HH:mm" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<appender name="HttpTraceAppender" type="log4net.Appender.ASPNetTraceAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Logs/Log.log" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10" />
<param name="MaximumFileSize" value="100K" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<root>
<level value="ERROR" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-FinanceWebSys-20121030155901;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-FinanceWebSys-20121030155901.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<!--spring新增-->
<!--<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory" />-->
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
</namespaces>
</pages>
<!--新增-->
<httpModules>
<!--<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32" />-->
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.0.0" newVersion="1.2.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
</configuration>

本文介绍了如何在Spring.Net、Nhibernate、ASP.MVC和EasyUI环境下进行事务管理实践,包括配置、注入、方法事务属性设置等。

214

被折叠的 条评论
为什么被折叠?



