数据库事务是由一系列的动作组成的这些动作被当作单独的一个工作单位这些动作要么被全部完整执行要么全部不被执行事务管理是关系数据中一个重要的部分
企业级应用使用事务来保证数据的完整性和一致性可以使用以下四个属性来描述事务
原子性
一个事务应该被当作一个单独的操作单位被执行也就是说这一连串的操作被执行成功或者不成功
一致性
这个代表数据库参照完整性的一致性表中存在唯一主键
隔离性
在同一个时刻可能会有多个事务的进程操作同一个数据集每一个事务应该同其他的事务隔离防止数据被篡改
持久性
一旦事务被执行成功事务的结果需要被持久化并且不能因为系统错误导致数据丢失
一个真正的关系型数据库管理系统会为每一个会话保证上面四个特性可以通过以下SQL实现
开始一个会话通过使用 Begin Transaction 命令
通过批量执行多个 delete updateinsert 操作
如果所有的操作被执行则执行commit操作否则执行rollback操作
Spring 框架在事务管理的API之上提供了一个抽象层Spring的事务支持的目的在于通过添加事务的能力到POJO来提供一个可选的EJB事务
Spring 提供编程式事务和声明式两种事务管理EJB需要一个应用服务器但是Spring事务管理能够被实现而不需要应用服务器
本地事务 和 分布式事务
本地事务特定于单个事务型资源例如JDBC连接而分布式事务能够在分布式系统中跨多个事务性资源
编程式事务 和 声明式事务
编程式事务管理 通过编程的方式来管理事务这种提供了极度的灵活性但是很难去维护
声明式事务管理 你需要从业务代码中分离事务管理你只能通过annotations 或者 基于XML的配置来管理事务
事务隔离级别
COMMITTED: 髒读能够被阻止不可重复读和幻读会发生
UNCOMMITTED: 髒读不可重复读和幻读会发生
REPEATABLE_READ 髒读和不可重复读能被阻止幻读会发生
SERIALIZABLE 髒读不可重复读幻读被阻止