事务的四大特性(ACID)
⑴ 原子性(Atomicity):每个事务是最小的业务执行单位,不可再分割。
⑵ 一致性(Consistency):在事务执行之前和之后数据保持一致性,例如银行转账,转账前和转账后两个账户的总金额应一致
⑶ 隔离性(Isolation):事务之间具有隔离性,张三李四之间的转账与王五存钱是两个事务。他们之间是隔离的。
⑷ 持久性(Durability):事务一旦提交,数据将永久性的存入数据库。
事务隔离级别:
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
读未提交表示一个事务读取到了另一个事务已经执行完但还未提交的数据,比如说事务2向表当中添加了一条数据,但是还没来得及提交。而此时事务1却已经在读取相同的表并且读到了这条数据。因此会产生脏读。脏读就是表示读到了没有提交的数据,那么这种数据就是不正确的数据。
不可重复读指的是在同一个事务当中的两次查询得到的却是不同的结果。 这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
可重复读(Repeatable Read),当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。因此,如果在同一个事务中发出同一个SELECT语句两次或更多次,那么产生的结果数据集总是相同的。因此,使用可重复读隔离级别的事务可以多次检索同一行集,并对它们执行任意操作,直到提交或回滚操作终止该事务。
Mysql 默认隔离级别为可重复读。
幻读是指同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。
串行化(也叫序列化) 提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
可重复读表示在读取数据的时候加锁,而序列化(串行化)表示在事务进行任何操作时都会加锁。串行化也是最高的隔离级别。