1、事务是什么
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
2、事务的四大特性
数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离
性(Isolation)、持久性(Durability)。
(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
(2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
(3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
(4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
3、事务隔离级别
在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题
脏读:
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读
指的是在数据库中的某个数据,一个事务范围内多次查询返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
幻读
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中的所有行的某个数据项对了从1修改到2的操作,此时事务T2对表中插入了一行数据项,而且这个数据项为1并提交。当T1再次查询刚刚修改的数据时,会发现还有一行没有被修改。这就是幻读
幻读和不可重复读都是读取另一条已经提交的事务(脏读是同一条事务查询的情况),所不同的是不可重复读查询的事同一个数据项,而幻读针对的事一批数据整体。
Mysql提供的四种隔离级别
①Read uncommitted(未提交读):最低级别,任何情况都可能发生
②Read committed(已提交读):避免脏读的发生
③Repeatable red(可重复读):避免脏读,不可重复读的发生
④Serializable(串行化):可避免脏读,不可重复读,幻读的发生
默认隔离级别为Rc
查询当前事务的隔离级别:select @@tx_isolation;
小知识:mysql的默认隔离级别为什么是Rc,而不是RR?
先说结论:因为之前没有row格式的binlog的情况下,如果隔离级别是rc,可能导致主从数据库不一致
原因:
binlog为statement记录的事master上产生的sql语句,按提交顺序记录的,因此binlog中日志记录的是先插入数据,后删除数据(虽然在master上是先删除后插入),逻辑上产生了不一致
解决:
使用rr隔离级别
binlog格式改为row