简单理解事务:

比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱;然后ATM出5000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了5000块但是ATM出钱失败的话,你将会损失5000元;如果银行卡扣钱失败但是ATM却出了5000块,那么银行将损失5000元。所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。 当这两个步骤提交了,执行完毕,这些数据将持久性地保存到数据库,永远无法回滚了。
事务就是用来解决类似问题的。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。

在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。

事务有四个特性:ACID

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

配置applicationContext.xml来执行spring 声明式事务管理

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="mod*" propagation="REQUIRED" />
<tx:method name="deleteSingleNews" propagation="REQUIRED" /> <tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice> <aop:config>
<aop:pointcut id="interceptorPointCuts" expression="execution(*news.dao.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
</aop:config>

理解图:

我们也可以通过注解的方法来操作spring 声明式事务管理

配置applicationContext.xml

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

注意:这里已经由在Dao类加入spring的事务管理,改为在service类加入spring的事务管理,因为service类调用Dao类操作了数据。

可以注解某个方法,也可以注解整个类。

@Transactionalpublic class NewsServiceImpl implements NewsService {
……
}

备注:(优点缺点,软件工程 ,耦合,之类。)

最新文章

  1. 数据库表A中随机X条数据满足N条件的数据插入到表B中
  2. Oracle 11g 修改字符集 为 ZHS16GBK
  3. ASP.NET Core 开发-缓存(Caching)
  4. 伪Acmer的推理(dfs/bfs)
  5. A trip through the Graphics Pipeline 2011_07_Z/Stencil processing, 3 different ways
  6. (转)PK系列之六:该不该读中文翻译的专业书
  7. dell ipmi sol
  8. mysql技术调优资料整理
  9. php开源项目学习二次开发的计划
  10. #python-dateutil下载地址
  11. HTTP初步注解
  12. 让textbox紧贴IME
  13. Rotational Region CNN
  14. ES3之变量提升 ( hoisting )
  15. 【iOS开发-36】Bundle Identifier的中文字符变成-的问题
  16. 【Oracle】存储过程在字符串单引号&#39;内拼接单引号&#39;
  17. PHP学习之输出字符串(echo,print,printf,printr和vardump)
  18. MariaDB主从半同步复制详解
  19. mvc4 坑啊
  20. 卡方分布、卡方独立性检验和拟合性检验理论及其python实现

热门文章

  1. CEGUI0.8.4例子
  2. Adressing
  3. linux中oops信息的调试及栈回溯【转】
  4. STM32与FreeRTOS实现低功耗
  5. Comparable和Comparator的区别
  6. 《编写可维护的JavaScript》——JavaScript编码规范(三)
  7. 每天一点Android干货-时间与日期、进度条
  8. 为现有图像处理程序添加读写exif的功能
  9. easyui 日期控件清空值
  10. linux 调用java main方法