Mysql的事务
一,Mysql事务的四大原则(ACID)
- 原子性 (A):事务是最小单位,不可再分
- 一致性 (C ) :事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
- 隔离性 (I):事务A和事务B之间具有隔离性
- 持久性 (D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
二,事务级别
- 读未提交:read uncommitted
- 读已提交:read committed
- 可重复读:repeatable read
- 串行化:serializable
三,不同事务级别并发可能会导致的问题
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交:read uncommitted | √ | √ | √ |
读已提交:read committed | × | √ | √ |
可重复读:repeatable read | × | × | √ |
串行化:serializable | × | × | × |
- 读未提交:read uncommitted:
- 一个事务可以读取另一个事务未提交的数据。会导致脏读,不可重复读。
- 举个例子:事务A执行插入。事务B执行查询。先执行事务A,完成了插入操作,但未提交,这时事务B执行了查询并返回结果,但是这时候事务A由于某些原因导致回滚提交,那么之前事务B返回的数据就是脏数据(数据库没有的但是读出来了),这就是脏读。
- 读已提交:read committed:
- 这个Oracle默认的事务级别。
- 同一个事务的多次读取返回的结果不一致。会导致不可重复读,幻读。
- 举个例子:事务A执行多次查询。事务B执行插入操作。事务A执行了两次查询返回的结果是null,事务A还未结束,这时候事务B执行了插入操作并提交了,这时事务A继续执行查询,发现前一次读取的数据与后面读取的数据不一致,这就是不可重复读问题。
- 可重复读:repeatable read:
- 这个事务级别是MySQL默认事务级别。会导致幻读。
- 举个例子:有一个事务执 判断一个用户是否存在如果不存在就进注册。这个事务是并发执行的,它们同时判断到用户都不存在,所以都插入了用户,那么最终结果是用插入了多个用户,这个就是幻读问题。
- 串行化:serializable:
- 这个隔离级别能解决 脏读,不可重复读,幻度问题,所有事务都排队执行,在并发的情况下,执行效率极低
- 如果数据库在不同机器上,那么这个单体事务也就会不生效,这时候就需要用到分布式事务