定义
事务:事务是一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的单位,是数据库环境中的逻辑工作单位,事务是为了保证数据完整性。
事务不能嵌套。
事务的结束:
1.正常提交commit,或者回滚rollback;
2.自动提交,一般情况下关闭,效率低
3.用户关闭会话之后,会自动提交事务
4.系统崩溃或者断电之后会回滚事务,即将数据恢复到上一个状态
事务的ACID属性
A原子性
表示不可分割,一个操作集合要么全部操作成功,要么操作失败,不可以从中间做切分。
C一致性
一致性代表了底层数据库的完整性。最终是为了保证数据的一致性,当经过N多个操作之后,数据的状态不会发生改变。
从一个一致性状态到另一个一致性状态,也就是数据不可以发生错乱。
I隔离性
各个事务之间相互不会产生影响。(隔离级别)
严格的隔离性会导致效率降低,在某些情况下为了提高程序的执行效率,会降低程序的隔离级别。
隔离级别以及异常情况
读未提交
读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。
读已提交
读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。
可重复读
可重复读,MySQL 默认的事务隔离级别。可重复读可以解决“不可重复读”的问题,但还存在幻读的问题。所谓的幻读指的是,在同一事务的不同时间使用相同 SQL 查询时,会产生不同的结果。例如,一个 SELECT 被执行了两次,但是第二次返回了第一次没有返回的一行,那么这一行就是一个“幻像”行。
注意:幻读和不可重复读的侧重点是不同的,不可重复读侧重于数据修改,两次读取到的同一行数据不一样;而幻读侧重于添加或删除,两次查询返回的数据行数不同。
序列化
序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。
不可重复读针对的是值的不同,幻读指的是数据条数的不同。
隔离级别 | 异常情况 | 异常情况 | 异常情况 |
---|---|---|---|
读未提交 | 脏读 | 幻读 | 不可重复读 |
读已提交 | 幻读 | 不可重复读 | |
可重复读 | 幻读 | ||
系列化 |
D持久性
所有数据的修改都必须要持久化到存储介质中,不会因为应用程序的关闭而导致数据丢失
四个属性中最重要的是C一致性,其他属性都是为了保证数据的一致性!
锁的机制:
为了解决在并发访问的时候,数据不一致的问题,需要给数据加锁
加锁的同时需要考虑《粒度》的问题:
操作的对象
数据库
表
行
一般情况下,锁的粒度越小,效率越高,粒度越大,效率越低
在实际的工作环境中,大部分的操作都是行级锁