企业建设营销型网站有哪些步骤青海网站建设公司
news/
2025/9/29 0:19:50/
文章来源:
企业建设营销型网站有哪些步骤,青海网站建设公司,网站设计团队,酒类产品网站设计目录 1、事务介绍2、事务的四个特性#xff08;ACID#xff09;3、Spring 事务管理的核心接口4、 PlatformTransactionManager 事务管理器5、TransactionStatus 事务状态6、TransactionDefinition 基本事务属性的定义7、Spring 编程式事务和声明式事务的区别 8、不用事务… 目录 1、事务介绍2、事务的四个特性ACID3、Spring 事务管理的核心接口4、 PlatformTransactionManager 事务管理器5、TransactionStatus 事务状态6、TransactionDefinition 基本事务属性的定义7、Spring 编程式事务和声明式事务的区别 8、不用事务实现转账9、编程式事务处理实现转账TransactionTemplate 10、声明式事务处理实现转账基于AOP的 xml 配置 11、声明式事务处理实现转账基于AOP的 注解 配置 1、事务介绍 事务Transaction一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 这里我们以取钱的例子来讲解比如你去ATM机取1000块钱大体有两个步骤第一步输入密码金额银行卡扣掉1000元钱第二步从ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话你将会损失1000元如果银行卡扣钱失败但是ATM却出了1000块那么银行将损失1000元。 如何保证这两个步骤不会出现一个出现异常了而另一个执行成功呢事务就是用来解决这样的问题。事务是一系列的动作它们综合在一起才是一个完整的工作单元这些动作必须全部完成如果有一个失败的话那么事务就会回滚到最开始的状态仿佛什么都没发生过一样。 在企业级应用程序开发中事务管理是必不可少的技术用来确保数据的完整性和一致性。 2、事务的四个特性ACID ①、原子性Atomicity事务是一个原子操作由一系列动作组成。事务的原子性确保动作要么全部完成要么完全不起作用。 ②、一致性Consistency一旦事务完成不管成功还是失败系统必须确保它所建模的业务处于一致的状态而不会是部分完成部分失败。在现实中的数据不应该被破坏。 ③、隔离性Isolation可能有许多事务会同时处理相同的数据因此每个事务都应该与其他事务隔离开来防止数据损坏。 ④、持久性Durability一旦事务完成无论发生什么系统错误它的结果都不应该受到影响这样就能从任何系统崩溃中恢复过来。通常情况下事务的结果被写到持久化存储器中。 3、Spring 事务管理的核心接口 首先我们创建一个Java工程然后导入 Spring 核心事务包 我们打开Spring的核心事务包查看如下类org.springframework.transaction 上面所示的三个类文件便是Spring的事务管理接口。如下图所示下面我们分别对这三个接口进行简单的介绍 4、 PlatformTransactionManager 事务管理器 Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager如上图所示Spring并不直接管理事务通过这个接口Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器也就是将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。 我们进入到 PlatformTransactionManager 接口查看源码 ①、TransactionStatus getTransaction(TransactionDefinition definition) 事务管理器 通过TransactionDefinition获得“事务状态”从而管理事务。 ②、void commit(TransactionStatus status) 根据状态提交 ③、void rollback(TransactionStatus status) 根据状态回滚 也就是说Spring事务管理的为不同的事务API提供一致的编程模型具体的事务管理机制由对应各个平台去实现。 比如下面我们导入实现事务管理的两种平台JDBC和Hibernate 然后我们再次查看PlatformTransactionManager接口会发现它多了几个实现类如下 5、TransactionStatus 事务状态 在上面 PlatformTransactionManager 接口中有如下方法 这个方法返回的是 TransactionStatus对象然后程序根据返回的对象来获取事务状态然后进行相应的操作。 而 TransactionStatus 这个接口的内容如下 这个接口描述的是一些处理事务提供简单的控制事务执行和查询事务状态的方法在回滚或提交的时候需要应用对应的事务状态。 6、TransactionDefinition 基本事务属性的定义 上面讲到的事务管理器接口PlatformTransactionManager通过getTransaction(TransactionDefinition definition)方法来得到事务这个方法里面的参数是TransactionDefinition类这个类就定义了一些基本的事务属性。 那么什么是事务属性呢事务属性可以理解成事务的一些基本配置描述了事务策略如何应用到方法上。事务属性包含了5个方面如图所示 TransactionDefinition 接口方法如下 一、传播行为当事务方法被另一个事务方法调用时必须指定事务应该如何传播。 Spring 定义了如下七中传播行为这里以A业务和B业务之间如何传播事务为例说明 ①、PROPAGATION_REQUIRED required , 必须。默认值A如果有事务B将使用该事务如果A没有事务B将创建一个新的事务。 ②、PROPAGATION_SUPPORTSsupports 支持。A如果有事务B将使用该事务如果A没有事务B将以非事务执行。 ③、PROPAGATION_MANDATORYmandatory 强制。A如果有事务B将使用该事务如果A没有事务B将抛异常。 ④、PROPAGATION_REQUIRES_NEW requires_new必须新的。如果A有事务将A的事务挂起B创建一个新的事务如果A没有事务B创建一个新的事务。 ⑤、PROPAGATION_NOT_SUPPORTED not_supported ,不支持。如果A有事务将A的事务挂起B将以非事务执行如果A没有事务B将以非事务执行。 ⑥、PROPAGATION_NEVER never从不。如果A有事务B将抛异常如果A没有事务B将以非事务执行。 ⑦、PROPAGATION_NESTED nested 嵌套。A和B底层采用保存点机制形成嵌套事务。 二、隔离级别定义了一个事务可能受其他并发事务影响的程度。 并发事务引起的问题 在典型的应用程序中多个事务并发运行经常会操作相同的数据来完成各自的任务。并发虽然是必须的但可能会导致以下的问题。 ①、脏读Dirty reads——脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了那么第一个事务获取的数据就是无效的。 ②、不可重复读Nonrepeatable read——不可重复读发生在一个事务执行相同的查询两次或两次以上但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新。 ③、幻读Phantom read——幻读与不可重复读类似。它发生在一个事务T1读取了几行数据接着另一个并发事务T2插入了一些数据时。在随后的查询中第一个事务T1就会发现多了一些原本不存在的记录。 注意不可重复读重点是修改而幻读重点是新增或删除。 在 Spring 事务管理中为我们定义了如下的隔离级别 ①、ISOLATION_DEFAULT使用后端数据库默认的隔离级别 ②、ISOLATION_READ_UNCOMMITTED最低的隔离级别允许读取尚未提交的数据变更可能会导致脏读、幻读或不可重复读 ③、ISOLATION_READ_COMMITTED允许读取并发事务已经提交的数据可以阻止脏读但是幻读或不可重复读仍有可能发生 ④、ISOLATION_REPEATABLE_READ对同一字段的多次读取结果都是一致的除非数据是被本身事务自己所修改可以阻止脏读和不可重复读但幻读仍有可能发生 ⑤、ISOLATION_SERIALIZABLE最高的隔离级别完全服从ACID的隔离级别确保阻止脏读、不可重复读以及幻读也是最慢的事务隔离级别因为它通常是通过完全锁定事务相关的数据库表来实现的 上面定义的隔离级别在 Spring 的 TransactionDefinition.class 中也分别用常量 -1,0,1,2,4,8表示。比如 ISOLATION_DEFAULT 的定义 三、只读 这是事务的第三个特性是否为只读事务。如果事务只对后端的数据库进行该操作数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读你就可以给数据库一个机会让它应用它认为合适的优化措施。 四、事务超时 为了使应用程序很好地运行事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定所以长时间的事务会不必要的占用数据库资源。事务超时就是事务的一个定时器在特定时间内事务如果没有执行完毕那么就会自动回滚而不是一直等待其结束。 五、回滚规则 事务五边形的最后一个方面是一组规则这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下事务只有遇到运行期异常时才会回滚而在遇到检查型异常时不会回滚这一行为与EJB的回滚行为是一致的 。但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样你还可以声明事务遇到特定的异常不回滚即使这些异常是运行期异常。 7、Spring 编程式事务和声明式事务的区别 编程式事务处理所谓编程式事务指的是通过编码方式实现事务允许用户在代码中精确定义事务的边界。即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理spring推荐使用TransactionTemplate。 声明式事务处理管理建立在AOP之上的。其本质是对方法前后进行拦截然后在目标方法开始之前创建或者加入一个事务在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务这样就不需要在业务逻辑代码中掺杂事务管理的代码只需在配置文件中做相关的事务规则声明(或通过基于Transactional注解的方式)便可以将事务规则应用到业务逻辑中。 简单地说编程式事务侵入到了业务代码里面但是提供了更加详细的事务管理而声明式事务由于基于AOP所以既能起到事务管理的作用又可以不影响业务代码的具体实现。 8、不用事务实现转账 我们还是以转账为实例。不用事务看如何实现转账。在数据库中有如下表 account ,内容如下 有两个用户 Tom 和 Marry 。他们初始账户余额都为 10000。这时候我们进行如下业务Tom 向 Marry 转账 1000 块。那么这在程序中可以分解为两个步骤 ①、Tom 的账户余额 10000 减少 1000 块剩余 9000 块。 ②、Marry 的账户余额 10000 增加 1000 块变为 11000块。 上面两个步骤要么都执行成功要么都不执行。我们通过 TransactionTemplate 编程式事务来控制 第一步创建Java工程并导入相应的 jar 包这里不用事务其实不需要这么多jar包为了后面的讲解需要我们一次性导入所有的jar包 第二步编写 Dao 层 AccountDao 接口 package com.ys.dao;public interface AccountDao {/*** 汇款* param outer 汇款人* param money 汇款金额*/public void out(String outer,int money);/*** 收款* param inner 收款人* param money 收款金额*/public void in(String inner,int money);} AccountDaoImpl 接口实现类 package com.ys.dao.impl;import org.springframework.jdbc.core.support.JdbcDaoSupport;import com.ys.dao.AccountDao;public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {/*** 根据用户名减少账户金额*/Overridepublic void out(String outer, int money) {this.getJdbcTemplate().update(update account set money money - ? where username ?,money,outer);}/*** 根据用户名增加账户金额*/Overridepublic void in(String inner, int money) {this.getJdbcTemplate().update(update account set money money ? where username ?,money,inner);}} 第三步实现 Service 层 AccountService 接口 package com.ys.service;public interface AccountService {/*** 转账* param outer 汇款人* param inner 收款人* param money 交易金额*/public void transfer(String outer,String inner,int money);} AccountServiceImpl 接口实现类 package com.ys.service.impl;import com.ys.dao.AccountDao;
import com.ys.service.AccountService;public class AccountServiceImpl implements AccountService{private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao accountDao;}Overridepublic void transfer(String outer, String inner, int money) {accountDao.out(outer, money);accountDao.in(inner, money);}} 第四步Spring 全局配置文件 applicationContext.xml ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSourceproperty namedriverClass valuecom.mysql.jdbc.Driver/propertyproperty namejdbcUrl valuejdbc:mysql://localhost:3306/test/propertyproperty nameuser valueroot/propertyproperty namepassword valueroot/property/beanbean idaccountDao classcom.ys.dao.impl.AccountDaoImplproperty namedataSource refdataSource/property/beanbean idaccountService classcom.ys.service.impl.AccountServiceImplproperty nameaccountDao refaccountDao/property/bean
/beans 第五步测试 public class TransactionTest {Testpublic void testNoTransaction(){ApplicationContext context new ClassPathXmlApplicationContext(applicationContext.xml);AccountService account (AccountService) context.getBean(accountService);//Tom 向 Marry 转账1000account.transfer(Tom, Marry, 1000);}} 第六步查看数据库表 account 上面的结果和我们想的一样Tom 账户 money 减少了1000块。而 Marry 账户金额增加了1000块。 这时候问题来了比如在 Tom 账户 money 减少了1000块正常。而 Marry 账户金额增加时发生了异常实际应用中比如断电这里我们人为构造除数不能为0的异常如下 那么这时候我们执行测试程序很显然会报错那么数据库是什么情况呢 数据库account 我们发现程序执行报错了但是数据库 Tom 账户金额依然减少了 1000 块但是 Marry 账户的金额却没有增加。这在实际应用中肯定是不允许的那么如何解决呢 9、编程式事务处理实现转账TransactionTemplate 上面转账的两步操作中间发生了异常但是第一步依然在数据库中进行了增加操作。实际应用中不会允许这样的情况发生所以我们这里用事务来进行管理。 Dao 层不变我们在 Service 层注入 TransactionTemplate 模板因为是用模板来管理事务所以模板需要注入事务管理器 DataSourceTransactionManager 。而事务管理器说到底还是用底层的JDBC在管理所以我们需要在事务管理器中注入 DataSource。这几个步骤分别如下 AccountServiceImpl 接口 package com.ys.service.impl;import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;import com.ys.dao.AccountDao;
import com.ys.service.AccountService;public class AccountServiceImpl implements AccountService{private AccountDao accountDao;private TransactionTemplate transactionTemplate;public void setTransactionTemplate(TransactionTemplate transactionTemplate) {this.transactionTemplate transactionTemplate;}public void setAccountDao(AccountDao accountDao) {this.accountDao accountDao;}Overridepublic void transfer(final String outer,final String inner,final int money) {transactionTemplate.execute(new TransactionCallbackWithoutResult() {Overrideprotected void doInTransactionWithoutResult(TransactionStatus arg0) {accountDao.out(outer, money);//int i 1/0;accountDao.in(inner, money);}});}} Spring 全局配置文件 applicationContext.xml ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSourceproperty namedriverClass valuecom.mysql.jdbc.Driver/propertyproperty namejdbcUrl valuejdbc:mysql://localhost:3306/test/propertyproperty nameuser valueroot/propertyproperty namepassword valueroot/property/beanbean idaccountDao classcom.ys.dao.impl.AccountDaoImplproperty namedataSource refdataSource/property/beanbean idaccountService classcom.ys.service.impl.AccountServiceImplproperty nameaccountDao refaccountDao/propertyproperty nametransactionTemplate reftransactionTemplate/property/bean!-- 创建模板 --bean idtransactionTemplate classorg.springframework.transaction.support.TransactionTemplateproperty nametransactionManager reftxManager/property/bean!-- 配置事务管理器 ,管理器需要事务事务从Connection获得连接从连接池DataSource获得 --bean idtxManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/bean
/beans 测试文件保持不变可以分两次测试第一次两次操作没有发生异常然后数据库正常改变了。第二次操作中间发生了异常发现数据库内容没变。 如果大家有兴趣也可以试试底层的PlatformTransactionManager来进行事务管理我这里给出主要代码 //定义一个某个框架平台的TransactionManager如JDBC、HibernateDataSourceTransactionManager dataSourceTransactionManager new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(this.getJdbcTemplate().getDataSource()); // 设置数据源DefaultTransactionDefinition transDef new DefaultTransactionDefinition(); // 定义事务属性transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED); // 设置传播行为属性TransactionStatus status dataSourceTransactionManager.getTransaction(transDef); // 获得事务状态try {// 数据库操作accountDao.out(outer, money);int i 1/0;accountDao.in(inner, money);dataSourceTransactionManager.commit(status);// 提交} catch (Exception e) {dataSourceTransactionManager.rollback(status);// 回滚} 10、声明式事务处理实现转账基于AOP的 xml 配置 Dao 层和 Service 层与我们最先开始的不用事务实现转账保持不变。主要是 applicationContext.xml 文件变化了。 我们在 applicationContext.xml 文件中配置 aop 自动生成代理进行事务管理 ①、配置管理器 ②、配置事务详情 ③、配置 aop ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdbean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSourceproperty namedriverClass valuecom.mysql.jdbc.Driver/propertyproperty namejdbcUrl valuejdbc:mysql://localhost:3306/test/propertyproperty nameuser valueroot/propertyproperty namepassword valueroot/property/beanbean idaccountDao classcom.ys.dao.impl.AccountDaoImplproperty namedataSource refdataSource/property/beanbean idaccountService classcom.ys.service.impl.AccountServiceImplproperty nameaccountDao refaccountDao/property/bean!-- 1 事务管理器 --bean idtxManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/bean!-- 2 事务详情事务通知 在aop筛选基础上比如对ABC三个确定使用什么样的事务。例如AC读写、B只读 等tx:attributes 用于配置事务详情属性属性tx:method name/ 详情具体配置propagation 传播行为 REQUIRED必须REQUIRES_NEW:必须是新的isolation 隔离级别--tx:advice idtxAdvice transaction-managertxManagertx:attributestx:method nametransfer propagationREQUIRED isolationDEFAULT//tx:attributes/tx:advice!-- 3 AOP编程利用切入点表达式从目标类方法中 确定增强的连接器从而获得切入点 --aop:configaop:advisor advice-reftxAdvice pointcutexecution(* com.ys.service..*.*(..))//aop:config
/beans 测试类这里我们就不描述了也是分有异常和无异常进行测试发现与预期结果是吻合的。 11、声明式事务处理实现转账基于AOP的 注解 配置 分为如下两步 ①、在applicationContext.xml 配置事务管理器将并事务管理器交予spring ②、在目标类或目标方法添加注解即可 Transactional 首先在 applicationContext.xml 文件中配置如下 !-- 1 事务管理器 --bean idtxManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/bean!-- 2 将管理器交予spring* transaction-manager 配置事务管理器* proxy-target-classtrue 底层强制使用cglib 代理--tx:annotation-driven transaction-managertxManager proxy-target-classtrue/ 其次在目标类或者方法添加注解Transactional。如果在类上添加则说明类中的所有方法都添加事务如果在方法上添加则只有该方法具有事务 package com.ys.service.impl;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.ys.dao.AccountDao;
import com.ys.service.AccountService;Transactional(propagationPropagation.REQUIRED , isolation Isolation.DEFAULT)
Service(accountService)
public class AccountServiceImpl implements AccountService{Resource(nameaccountDao)private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao accountDao;}Overridepublic void transfer(String outer, String inner, int money) {accountDao.out(outer, money);//int i 1/0;accountDao.in(inner, money);}} 转载于:https://www.cnblogs.com/chedahui/p/10069177.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921289.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!