2018-1-5 by Atlas安全
事务是一组逻辑连续的操做,这些操做组合成一个完整的、逻辑的操做。并发
- 原子性(atomicity):
事务是原子操做,组成事务的全部操做的执行结果,要么都成功,要么都不成功,不可能部分红功部分不成功。- 一致性(consistency):
事务执行先后,完整性约束没有被破坏,包括数据完整、逻辑完整。- 隔离性(isolation):
并发的事务执行互不干扰,这些事务并发执行结果和它们前后单独执行结果同样。- 持久性(durability):
事务执行完成,事务执行的全部操做结果都会被持久化。
之因此进行事务隔离,是由于事务并发可能产生问题:ide
- 脏读(dirty read):
一个事务执行过程当中读取到了其余事务没有提交随后撤销的中间状态数据,并发的事务操做后可能对并发访问的数据形成完整性约束的破坏。- 不可重复读(non-repeatable read):
一个事务执行过程当中读取到了其余事务已经提交的数据,这个事务屡次访问的数据发生内容更新,可能影响事务逻辑的完整性约束。- 幻读(phantom read):
一个事务执行过程当中读取到了其余事务已经提交的数据,这个事务屡次访问的数据发生数量更新,可能影响事务逻辑的完整性约束。事务隔离是手段,隔离级别:atom
- read uncommitted:
存在发生脏读、不可重复读、幻读的状况。- read committed:
解决了脏读,存在发生不可重复读、幻读的状况。- repeatable read:
解决了脏读、不可重复读,存在发生幻读的状况。- serializable:
事务串行,不存在事务并发致使的脏读、不可重复读、幻读问题。
理论上世间万物相生相克,不一样隔离级别的实现解决问题的程度不一样,天然耗费的时间、空间资源也不一样,按需选择。
public interface TransactionDefinition { // 事务名称 String getName(); // 事务传播行为 int getPropagationBehavior(); // 事务隔离级别 int getIsolationLevel(); // 事务超时时长 int getTimeout(); // 事务是否只读 boolean isReadOnly(); }
public interface TransactionStatus extends SavepointManager, Flushable { // 是否新事务 boolean isNewTransaction(); // 是否有安全点 boolean hasSavepoint(); // 标记为rollback-only void setRollbackOnly(); // 是否为rollback-only boolean isRollbackOnly(); // 是否已经完成 boolean isCompleted(); }
方法即行为,事务传播行为即授予方法何种事务行为。code
- PROPAGATION_REQUIRED
执行到当前方法,若是存在事务,则做为当前事务的操做执行;不然,新建一个事务并执行。- PROPAGATION_SUPPORTS
执行到当前方法,若是存在事务,则做为当前事务的操做执行;不然,以非事务的方式执行。- PROPAGATION_MANDATORY
执行到当前方法,若是存在事务,则做为当前事务的操做执行;不然,抛出异常。- PROPAGATION_REQUIRES_NEW
执行到当前方法,若是存在事务,则挂起当前事务,而后新建一个事务并执行,新建的事务和挂起的事务不存在提交等待和失败回滚依赖,相互独立;不然,新建一个事务并执行。- PROPAGATION_NOT_SUPPORTED
执行到当前方法,若是存在事务,则挂起当前事务,而后以非事务的方式执行;不然,以非事务的方式执行。- PROPAGATION_NEVER
执行到当前方法,若是存在事务,则抛出异常;不然,以非事务的方式执行。- PROPAGATION_NESTED
相似 PROPAGATION_REQUIRES_NEW ,区别是新建的事务和挂起的事务存在提交等待和失败回滚依赖,共进退。
public interface PlatformTransactionManager { // 接收TransactionDefinition对象 返回TransactionStatus对象 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; // 提交 void commit(TransactionStatus status) throws TransactionException; // 回滚 void rollback(TransactionStatus status) throws TransactionException; }