MySql中的事务:指将一组SQL语句放在一个批次执行,如果其中有一条语句执行失败,则数据库回退到事务刚开始的状态
事务是为了解决一个逻辑上的整体操作(例如:A向B转账100元)在数据库层面分步操作(例如:A的账户减100元,B的账户加100元)时,因为某一步出现问题而导致数据库层面合理而逻辑层面不合理(例如:A的账户已经减了100元,而B的账户数据更新失败)的问题
事务的四个特性:
- 原子性:事务中的所有对数据库的操作是一个整体,不可再分,要么全部执行,要么全部不执行
- 一致性:事务执行后必须使数据库从一个一致性状态转变为另一个一致性状态(一致性状态指数据库中的数据必须满足我们在数据库层面设定的对数据的约束规则)
- 隔离性:在事务并行执行时,事务之间不会相互影响(不同隔离级别下,隔离性的强弱不同)
- 持久性:事务一旦执行完毕,事务对数据库的改变是持久的,不会因故障和其他事务而改变
事务的四种隔离级别:
- 读未提交内容(Read Uncommitted):所有事务都可以读到其他未提交事务的执行结果,没有隔离性可言
- 读提交内容(Read Committed):所有事务只能读取其他事务提交以后的执行结果,每次读取都是基于当前数据库的状态,所以在同一事务中多次读取的结果可能不同(因为期间其他事务可能对数据做了修改并提交)
- 可重复读(Repeatable Read):当前事务读取的数据主要是基于事务开启时的数据库状态,不会因为其他事务的执行而改变,保证每次读取到的数据是一致的。但当当前事务修改一些在这期间被其他事务修改并提交的数据时,修改后的结果对当前事务是可见的,即读取的结果会更新至当前数据库状态,读取结果会不同
- 可串行化(Serializable):数据库会强制事务排队,防止并发修改引起的异常
不同隔离级别下可能会出现的问题:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交内容 | √ | √ | √ |
读已提交内容 | × | √ | √ |
可重复读 | × | × | √ |
可串行化 | × | × | × |
- 脏读:指事务读取到了其他事务未提交的数据,这些数据未经事务提交,是非持久化的,可能会发生改变,导致其他事务的处理出问题
- 不可重复读:指在同一事务中同一个查询条件读取的数据是不同的,这些不同主要是因为期间其他事务对数据做出修改
- 幻读:指在同一个事务中同一个查询条件读取的数据行数不一致