什么是事务?
事务就是一组具有原子性的操作。这组操作要么全部执行,要么全部不执行。
事务的四大特性(ACID)
原子性(Atomicity):原子性指的是事务是一个不可分割的操作,要么全部执行,要么全部不执行。
一致性(Consistency): 事务执行前后,数据库的完整性约束没有被破坏。
隔离性(Isolation):每个事务都是相互独立的,一组事务不会看到另一组正在执行的事务数据。
持久性(Durability):当数据库被破坏之后,事务提交保存的数据依旧存在。事务只能保证数据库的高可靠性。
数据库并发所引起的问题
1.更新丢失
两个并发执行的事务,更新同一行数据。一个事务可能会覆盖掉另外一个事务。当数据库没有加任何锁的情况下,会发生这种情况。
2.脏读
一个事务读到另一个事务没有提交的数据,可能会因为回滚从而失败。
3.不可重复读
含义:当一个事务读同一行数据两次,但是两次所得到的数据不相同。具体分为两种情况:
(1)虚读:在事务1读取同一记录的数据时,事务2对数据进行修改,从而事务1第二次所读到不同的数据。
(2)幻读:在事务1查询同一记录的数据时,事务2进行删除,插入,从而事务1第二次查询的是不同的数据。
事务的隔离级别
事务的隔离性是处理事务的几大基础之一,而隔离级别就是提供给用户在性能和可靠性上做出选择和权衡的配置项。
ISO 和 ANIS SQL 标准制定了四种事务隔离级别,而 InnoDB 遵循了 SQL:1992 标准中的四种隔离级别:
(1)Read uncommitted(读未提交)
当一个事务对一行数据进行修改的时候,不允许其他事务进行修改。但是允许其他事务进行读操作。
使用查询语句不会加任何锁。
只能防止更新丢失,不能防止不可重复读和脏读。
(2)Read committed(读提交)
一个未提交的事务不允许其他事务进行操作和访问。但是在读取数据的时候允许其他事务对其访问。
对记录只加了记录锁,不会对记录加间隙锁。
不会出现脏读,但是会出现幻读。
(3)Repeatable Read(重复读)
在该级别下,在读事务时,不允许写事务,但是允许读事务。在写事务时禁止一切操作。
(4)Serialable(序列化)
该级别要求所有的操作都串行执行,不会出现因并发访问所引起的问题,但是性能太低。
InnoDB隐式地将所有查询语句加上共享锁,解决了幻读的问题。
隔离级别越高越能保证数据库的完整性和隔离性,但是性能方面越低。MySQL默认的隔离级别是Repeatable Read。但是我们在选择时候,一般选择read committed,虽然会出现幻读的情况,这时我们用悲观锁和乐观锁进行来控制。