1.事务四大特性(ACID)原子性、一致性、隔离性、持久性?
事务四大特征:原子性,一致性,隔离性和持久性。
-
原子性(Atomicity) 一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。
-
一致性(Consistency)
一致性代表了底层数据存储的完整性。它必须由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持久性来满足这一要求; 应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(即,数据预期所表达的现实业务情况不相一致)。例如,在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。
- 隔离性(Isolation)
隔离性意味着事务必须在不干扰其他进程或事务的前提下独立执行。换言之,在事务或工作单元执行完毕之前,其所访问的数据不能受系统其他部分的影响。
- 持久性(Durability)
持久性表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。这样可以保证,所做的修改在任何系统瘫痪时不至于丢失。
2.事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?
-
Read uncommitted (未提交读):最低级别,任何情况都无法保证(脏读、不可重复读、幻读)。
-
Read committed (已提交读):可避免脏读的发生。
-
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
-
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
1.脏读:事务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。
2.不可重复读:事务 A 读取了事务 B 已提交的更改数据。
3.幻读:事务 A 读取了事务 B 已提交的新增数据。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);
而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (已提交读)这两种级别,其中默认的为Read committed级别。
事务隔离级别
- 如果没有,就开启一个事务;如果有,就加入当前事务(方法A加入到方法B)。这就是 PROPAGATION_REQUIRED,它也是 Spring 提供的默认事务传播行为,适合绝大多数情况。
- 如果没有,就开启一个事务;如果有,就将当前事务挂起。这就是 RROPAGATION_REQUIRES_NEW,意思就是创建了一个新事务,它和原来的事务没有任何关系了。
- 如果没有,就开启一个事务;如果有,就在当前事务中嵌套其他事务。这就是 PROPAGATION_NESTED,也就是传说中的“嵌套事务”了,所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)。
- 如果没有,就以非事务方式执行;如果有,就使用当前事务。这就是 PROPAGATION_SUPPORTS,这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正我是支持你的。
- 如果没有,就以非事务方式执行;如果有,就将当前事务挂起。这就是 PROPAGATION_NOT_SUPPORTED,这种方式非常强硬,没有就没有,有我也不支持你,把你挂起来,不鸟你。
- 如果没有,就以非事务方式执行;如果有,就抛出异常。这就是 PROPAGATION_NEVER,这种方式更猛,没有就没有,有了反而报错,确实够牛的,它说:我从不支持事务!
- 如果没有,就抛出异常;如果有,就使用当前事务。这就是 PROPAGATION_MANDATORY,这种方式可以说是牛逼中的牛逼了,没有事务直接就报错,确实够狠的,它说:我必须要有事务!
1.事务超时(Transaction Timeout):为了解决事务时间太长,消耗太多的资源,所以故意给事务设置一个最大时长,如果超过了,就回滚事务。
2.只事务(Readonly Transaction):为了忽略那些不需要事务的方法,比如读取数据,这样可以有效地提高一些性能。
3.MySQL的MyISAM与InnoDB两种存储引擎在事务、锁级别,各自的适用场景?
事务处理上方面
MyISAM:强调的是性能,每次查询具有原子性,其执行速度比 InnoDB 类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务 (commit)、回滚 (rollback) 和崩溃修复能力 (crash recovery capabilities) 的事务安全 (transaction-safe (ACID compliant)) 表。
锁级别
MyISAM:只支持表级锁,用户在操作 MyISAM 表时,select,update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是 innodb 的最大特色。行锁大幅度提高了多用户并发操作的性能。但是 InnoDB 的行锁,只是在 WHERE 的主键是有效的,非主键的 WHERE 都会锁全表的。
4.事务回滚(Transaction Rollback)和事务提交(Transaction Commit)
事务回滚: 事务回滚是指在事务执行过程中,如果发生错误、异常或其他问题,可以将事务中的所有操作撤销,将数据库恢复到事务开始之前的状态。当事务回滚发生时,所有的更改,包括插入、更新和删除操作,都将被撤销,数据库不会受到事务的影响。事务回滚可以用于保护数据的完整性,确保不会留下半途而废的更改。事务提交: 事务提交是指在事务执行成功完成后,将事务中的所有操作永久保存到数据库中。当事务提交发生时,所有的更改都会被写入数据库,从而更新数据。事务提交表示事务成功完成,所有的操作被确认,并且数据库状态被改变。在数据库管理中,事务回滚和事务提交是确保数据的一致性和完整性的关键机制。如果事务执行期间出现错误或其他问题,事务回滚可以防止数据变得不一致或损坏。当事务成功完成并通过事务提交后,数据库中的数据将反映事务的更改。