一、数据库事务
数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
事务的四个关键属性(ACID):
(1)原子性(atomicity):事务是一个原子操作, 由一系列动作组成.事务的原子性确保动作要么全部完成要么完全不起作用.
(2)一致性(consistency):一旦所有事务动作完成, 事务就被提交.数据和资源就处于一种满足业务规则的一致性状态中.
(3)隔离性(isolation):可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来,防止数据损坏.
(4)持久性(durability):一旦事务完成, 无论发生什么系统错误,它的结果都不应该受到影响.通常情况下,事务的结果被写到持久化存储器中.
二、Spring支持两种类型的事务管理:
作为企业级应用程序框架, Spring 在不同的事务管理 API 之上定义了一个抽象层.而应用程序开发人员不必了解底层的事务管理 API,就可以使用 Spring的事务管理机制.
编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
声明式事务管理
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。
(1)基于tx和aop名字空间的xml配置文件
事务管理是一种横切关注点
为了在 Spring 2.x 中启用声明式事务管理,可以通过 tx Schema中定义的
声明了事务通知后, 就需要将它与切入点关联起来.由于事务通知是在
由于 Spring AOP 是基于代理的方法,所以只能增强公共方法.因此, 只有公有方法才能通过 Spring AOP进行事务管理.
(2)基于@Transactional注解
为了将方法定义为支持事务处理的, 可以为方法添加@Transactional 注解.根据 Spring AOP基于代理机制,只能标注公有方法.
可以在方法或者类级别上添加 @Transactional 注解.当把这个注解应用到类上时,这个类中的所有公共方法都会被定义成支持事务处理的.
在 Bean 配置文件中只需要启用
如果事务处理器的名称是 transactionManager, 就可以在