mysql 之事务系列
事务特性(acid)
(1)原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做。
(2)一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
(3)隔离性(Isolation):一个事务的执行不能其它事务干扰。
(4)持久性(Durability):也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
隔离级别:低级别的级别支持的并发越多,性能也越高。
(1)Read Uncommitted(读取未提交内容)
所有事务都可以看到未提交事务的提交结果, 因为读取未提交的数据,也被称为脏读。
(2)Read Committed(读取提交内容)
一个事务只能够读取已经提交事务改变的数据,这种隔离级别支持不可重复读。因为同一个事务的其他实例在读取时会有其他实例有提交,所以同一个select可能返回不同的结果。
(3)Repeatable Read(可重读)
在同一事务的不同的实例下,并发读取数据情况下,看到不同的数据行,为此导致出现了幻读。
也就是,两个事务同时操作,事务第一次没读取数据,另一事务此时插入对应的数据,此时要再次读取才能读取数据。
(4)Serializable(可串行化)
最高的隔离级别,它通过强制事务排序,使之不可能相互冲突
前提:
set session transaction isolation level read uncommitted;
查看隔离级别是否设置成功
select @@transaction_isolation (mysql版本 8.0 以后)
select @@tx_isolation (mysql版本 8.0 之前)
查看mysql版本
> status
(1)read uncommitted (读取未提交内容) , 同时打开的事务实例不可以读取
A> set session transaction isolation level read uncommitted;//设置隔离级别
B>start transaction, 启动事务a 和事务b,
C > 事务a更新数据,但是不提交。
D> 非事务查询数据,查询到是更新数据,此时出现了 脏读
E>rollback , 回滚事务a,
F> 查询到原来的数据。
(2)read committed(读取已提交内容),
A> set session transaction isolation level read committed;
B>start transaction, 启动事务a 和事务b,事务a更新数据,但是不提交。
C > 非事务查询数据,查询到数据是提交之前的数据。
D> 提交事务。
E> 非事务和事务b查询的数据提交事务之后的数据, 此时出现时不可重复读, 事务b 读取时事务a提交后的数据。
(3)repeatable read (可重复读)
A> set session transaction isolation level repeatable read;
B> 同时启动两个事务a 和 b ,
C> 事务a, 更新一条数据, 未提交。
D> 事务b , 查询未发现数据修改。
E> 事务a , 提交。
F> 此时事务b 再查询,查询未发现数据修改, 可以重复读。
G> 再次添加一条记录, 事务b 下, 也查询不到数据, 只有当事务b 提交后,再次查询才能读取新的数据。
(4)Serializable(可串性话)
A> set session transaction isolation level serializable;
B> start transaction, 同时启动事务a 和事务b,
C > 事务a和事务b ,同时对一记录做操做,发现事务b,处于等待状态,等事务A,提交之后,事务B才会解除这种状态(可能出现超时操作)。