说明
记录一点点
事务
事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
事务和程序是两个概念,在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。一个程序通常包含多个事务。
定义事务
事务定义分为两种方式:分别为显示定义和隐式定义。
- 显式定义方式
1.事务正常结束
提交事务的所有操作
事务中所有的对数据库的更新写回到磁盘上的物理数据库中
BEGIN TRANSACTION
SQL 语句1
SQL 语句2
……
COMMIT
2.事务异常终止
事务运行的过程中发生了故障,不能继续执行。系统将事务中对数据库的所有已完成的操作全部撤销,事务回滚到开始时的状态。
BEGIN TRANSACTION
SQL 语句1
SQL 语句2
……
ROLLBACK
- 隐式定义方式
当用户没有显式地定义事务时,数据库管理系统按缺省规定自动划分事务。
事务的特性(ACID)
- 原子性
原子性是指事务是数据库的逻辑工作单位
事务中的操作要么都做,要么都不做 - 一致性
事务执行的结果必须是使数据库从一个一致性状态变成另一个一致性状态 - 隔离性
一个事务的执行不能被其他事务干扰
一个事务内部的操作及使用的数据对其他并发事务是隔离的
并发执行的各个事务之间不能相互干扰 - 持续性
也称永久性,一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。
保证事务ACID特性是事务处理的任务
隔离问题
- 脏读
一个事务读到另一个事务没有提交的数据 - 不可重复读
一个事务读到另一个事务已提交的数据(update) - 虚读(幻读)
一个事务读到另一个事务已提交的数据(insert)
隔离级别
- read uncommitted,读未提交
- read commit,读已提交,解决脏读问题
- repeatable read,可重复度,解决脏读和不可重复读
- serializable,串行化,解决脏读,不可重复读和虚读
Spring中管理事务
三个顶级接口
- PlatformTransactionManager事务管理器
- TransactionDefinition事务详情,包括隔离级别,是否可读,超时时间等
- TransactionStatus事务状态,包括是否有保存点,事务对否可读等
事务管理器
常见的事务管理器有下面两种:
- DataSourceTransactionManager
- HibernateTransactionManager
事务状态
isNewTransaction() 是否是新的事务
hasSavepoint() 是否有保存点
setRollbackOnly() 设置回滚
isRollbackOnly() 是否回滚
flush() 刷新
isCompleted() 是否完成
事务详情
getName() 配置事务详情名称,一般方法名称
isReadOnly() 是否只读
getTimeOut() 获得超时时间
getIsoLationLevel() 隔离级别
getPropagationBehavior() 传播行为
传播行为
传播行为是指两个业务之间如何共享事务,有以下几种
- PROPAGATION_REQUIRED 必须
支持当前事务,A如果有事务,B将使用该事务。如果A没有事务,B将创建一个新的事务。 - PROPAGATION_SUPPORTS 支持
支持当前事务,A如果有事务,B将使用该事务。如果A没有事务,B将以非事务执行。 - PROPAGATION_MANDATOR 强制
支持当前事务,A如果有事务,B将使用该事务。如果A没有事务,B将抛异常。 - PROPAGATION_REQUIRES_NEW 必须新的
如果A有事务,将A的事务挂起,B创建一个新的事务。如果A没有事务,B将创建一个新的事务。 - PROPAGATION_NOT_SUPPORTED 不支持
如果A有事务,将A的事务挂起,B将以非事务执行。如果A没有事务,B将以非事务执行。 - PROPAGATION_NEVER 从不
如果A有事务,B将抛异常。如果A没有事务,B将以非事务执行。 - PROPAGATION_NESTED 嵌套
A和B底层采用保存点机制,形成嵌套事务。