MySQL事务

1.事务的基本要素(ACID)

  • 原子性:事务是一个不可分割的整体,:事务开始后所有操作,要么全部做完,要么全部不做, 不可能停滞在中间环节。
  • 一致性:事务开始前和结束后,数据库的完整性约束没有被破 坏 。比如 A 向 B 转账,不可能 A 扣了钱,B 却没收到。
  • 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
  • 持续性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚

2.事务的隔离级别

2.1第一种隔离级别:Read uncommitted(读未提交)

  • 读未提交:如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

2.2第二种隔离级别:Read committed(读已提交)

  • 当前事务只能读取其他事务已提交的数据,这个隔离级别避免了脏读,但是可能出现不可重复读,即事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

2.3第三种隔离级别:Repeatable-read(可重复读)

  • 可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。比如系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

2.4第四种隔离级别:serializable(串行化)

  • 提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。 解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

你可能感兴趣的:(MySQL,mysql,数据库)