事务特性:
原子性(Atomicity)/一致性(Consistency)/隔离性(Isolation)/持久性(Durability)
隔离级别:
Read Uncommitted: 一个事务可以读取另一个事务没有提交的更新结果。带来的问题:
脏读,一个事务对数据进行了更新,但是没有提交,另一个事务看到了这个事务没有提交的更新结果,如果第一个事务回滚,那第二个事务看到的就是一笔脏数据。
不可重复读,如果事物1在事务2的更新操作之前读取一次数据,在事务2的update操作之后再读取同一笔数据一次,两次结果是不同的。
幻读,事务1要更新表中所有数据,同时,事务2向表中insert一行新数据。那么,操作第一个事务的用户发现表中还有没有修改的数据行,就是幻读。
不可重复读重点是update,幻读重点是insert和delete。
Read Committed:大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。可比避免脏读,但不可避免不可重复读和幻读。
Repeatable Read:保证在整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。避免了脏读和不可重复读,但无法避免幻读。
Serializable: 最为严格最为安全的隔离级别。可以避免所有问题。但性能最差。所以很少场景使用。
通常情况,会使用其他隔离级别加上相应的并发锁的机制来控制对数据的访问,这样既保证系统性能不会损失太大,也能够在一定程度上保证数据的一致性。
隔离级别与系统并发性成反比,与数据一致性成正比。
事务参与者:
Resource Manager:简称RM,负责存储并管理系统数据资源的状态,如数据库服务器,JMS消息服务器等。
Transaction Processing Monitor:简称TP monitor在分布式事务场景中协调包含多个Resource Manager的事务处理。
Transaction Manager:简称TM,负责多个RM只见事务处理的协调工作。
Application:以独立形式存在的或者运行于容器中的应用程序。
事务分类:
全局事务:整个事务处理过程中有多个RM参与(也就是涉及多个数据库服务器),那么就需要引入TP Monitor来协调多个RM之间的事务处理。通过TP Monitor的调配后,直接由TM统一协调。
局部事务:当前事务只有一个RM参与。在当前事务中只对一个数据库进行更新。
局部事务和全局事务的主要区分在于事务中涉及多少个RM,而不是系统中实际有多少个RM。
Spring事务框架
基本原则:让事务管理的关注点与数据访问关注点相分离。
example:
package com.ivy.Transaction; import org.springframework.dao.DataAccessException; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; public class FooService { private PlatformTransactionManager transactionManager; public PlatformTransactionManager getTransactionManager() { return transactionManager; } public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public void serviceMethod() { TransactionDefinition definition = ..; TransactionStatus txStatus = getTransactionManager().getTransaction(definition); try { // dao1.doDataAccess(); // dao2.doDataAccess(); // ... } catch(DataAccessException e) { getTransactionManager().rollback(txStatus); throw e; } catch(OtherNecessaryException e) { getTransactionManager().rollback(txStatus); throw e; } getTransactionManager().commit(txStatus); } }
PlatformTransactionManager是Spring事务抽象框架的核心接口。定义如下:
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
TransactionDefinition
主要定义了可以指定的属性:
事务的隔离级别:通常是ISOLATION_DEFAULT
事务的传播行为:通常是PROPAGATION_REQUIRED, 即如果当前存在一个事务,则加入当前事务,如果不存在任何事务,则创建一个新的事务。
事务的超时时间:TIMEOUT_DEFAULT, 默认为-1, 即采用当前事务系统默认的超时时间
事务是否只读:对于一些查询来说,我们通常会希望它们采用只读事务。