1.什么是事务
事务是数据库的概念,指一系列操作。这组操作要么全部成功,要么全部不成功。
1.1 事务的要素(ACID)
- 原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。
- 一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
- 隔离性(Isolation): 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
- 持久性(Durability): 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
1.2事务的属性
//版本为4.3.25
package org.springframework.transaction;
public interface TransactionDefinition {
//传播行为
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
//隔离级别
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
//超时默认值
int TIMEOUT_DEFAULT = -1;
//返回事务传播行为
int getPropagationBehavior();
// 返回事务的隔离级别,事务管理器根据它来控制
//另外一个事务可以看到本事务内的哪些数据
int getIsolationLevel();
//事务超时时间,事务必须在多少秒之内完成
int getTimeout();
//事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的
boolean isReadOnly();
//事务的名字
String getName();
}
1.3事务的传播行为
传播行为 | 含义 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务则加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 表示该方法在事务中运行,如果当前事务不存在,则会抛出异常 |
PROPAGATION_REQUIRED_NEW | 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。 |
PROPAGATION_NOT_SUPPORTED | 表示该方法不应该运行在事务中。如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类型的操作 |
1.4并发事务导致的问题
我觉得恶霸 | 可能原因 |
---|---|
脏读 | 发生在一个事务读取了另外一个事务改写尚未提交的数据时,改写的数据被回滚了,那么第一个事务获取的数据无效 |
1.5事务的隔离性
隔离级别 | 作用 |
---|---|
Serializable | 可避免脏读、不可重复读、虚读情况的发生 |
Repeatable | 可避免脏读、不可重复读情况的发生 |
Read Committed | 可避免脏读情况发生 |
Read Uncommitted | 最低级别,以上情况均无法保证 |
2.事务的用处
事务保证了数据的一致性。 在处理业务中,存在进行对多个表操作,但如果某个表的数值存储失败,可以进行事务回滚。回滚至操作之前的数据。
3.spring的事务管理
参考资料:
Spring 事务 -- @Transactional的使用https://www.jianshu.com/p/befc2d73e487