一、ACID
事务满足的四个条件:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
二、事务并发问题
脏读
事务B去查询了事务A修改过的数据,但是此时事务A还没有提交,所以事务A随时会回滚导致事务B再次查询就读不到刚才事务A修改的数据了
脏写
事务B去修改了事务A修改过的值,但是此时事务A还没有提交,所以事务A随时会回滚,导致事务B修改的值也没有了
不可重复读
在一个事务内读取表中的某一行数据,多次读取结果不同
幻读
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致
三、事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(Read uncommitted) | 可能 | 可能 | 可能 |
读已提交(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable) | 不可能 | 不可能 | 不可能 |
查询当前事务隔离级别
mysql> select @@tx_isolation;
mysql> select @@global.tx_isolation;
设置当前事务隔离级别
set global transaction isolation level [隔离级别] 永久设置 系统级别
set session transaction isolation level 临时设置 当前会话
读已提交----解决脏读
A:客户端
set session transaction isolation level read committed;
start transaction;
commit
B:客户端
set session transaction isolation level read committed;
start transaction;
commit
tips:
开启事务之后
B端进行修改数据但未提交
A端查询查询不到B端修改的数据
B端提交数据
A端能够查询到B端的数据
读未提交
A:客户端
set session transaction isolation level read uncommitted;
start transaction;
commit
B:客户端
set session transaction isolation level read uncommitted;
start transaction;
commit
tips:
开启事务之后
B端修改数据但未提交
A端能够查询到B端修改的数据
B端进行回滚操作
A端查询到的数据是B端修改之前的数据
可重复读
A:客户端
set session transaction isolation level repeatable read;
start transaction;
commit;
B:客户端
set session transaction isolation level repeatable read;
start transaction;
commit;
tips:
开启事务之后
B端修改数据但未提交
A端查询不到B端修改后的数据
B端提交
A端查询不到B端提交后的数据
在A端修改数据
A端查询到是是在B端修改数据以后的基础上修改的数据