事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
1、事务必须满足四个条件(ACID):原子性、一致性、隔离性、持久性。
原子性(Atomicity,不可分割性):一个事务(transaction)中的所有操作要么全部完成,要么全部不完成,不会在中间结束。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有被执行过一样。
一致性(Consistency):在事务开始之前和事务结束之后,数据库的完整性没有被破坏。这表示所有写入的资料符合预设规则,这包含资料的精准度、串联性以及数据库后续可以自发的完成预设的工作。
隔离性(Isolation,独立性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务同时执行时由于交叉执行导致的数据不一致。事务的隔离性分为不同级别,包括读未提交(Read uncommitted)、读提交(Read committed)、可重复读(repeatable read)和序列化(Serializable)。
当数据库执行事务操作时,mysql会在被作用的表上加锁,防止其他用户改表。
脏读 | 不可重复读 | 幻读 | |
Read uncommitted 读取未提交 | 可能出现 | 可能出现 | 可能出现 |
Read committed 读取已提交数据 | 不可能出现 | 可能出现 | 可能出现 |
Repeatable read 重复读数据 | 不可能出现 | 不可能出现 | 可能出现 |
Serializable 序列化 | 不可能出现 | 不可能出现 | 不可能出现 |
读取未提交:这个隔离级别是最低的,一个事务可以读取到另一个事物提交事务前的数据。这种读取称为脏读。
读取已提交:两个并发执行的事务,一个事务对数据进行操作,同一时刻另一个事务可以只可以读取不可以进行修改,可能导致两次读取的结果不一致。称为不可重复读。
重复读取数据:两个并发的事务,一个事务操作时,同一时刻另一个事务不可以查询,需要在查询结束后在读取,导致两次读取结果不一致。称为幻读。
序列化:最高级别的事务隔离,性能很低,不会出现幻读等场景。
持久性(Durability):事务处理结束后,对数据的修改是永久的,不会因为系统故障导致丢失。
2、事务处理
在MySQL中只有使用了Innodb数据库引擎才支持事务。
在MySQL命令行的默认设置下,事务都是自动提交的。因此在开启一个事务之前,需要显示的开启事务命令start transaction,或者执行命令set autocommit=0,用来禁止自动提交。
begin—开启一个事务 Rollback—回滚 commit—事务确认
set autocommit=0设置手动提交 set autocommit=1设置自动提交
查看事务级别:select @@tx_isolation;
设置事务级别:set session transaction isolation level 事务级别;