事务隔离

一、事务的四大特性
1.原子性:事务包含的所有操作要么全部成功,要么全部失败回滚
2.一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。数据库的完整性约束没有被破坏
3.隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰
4.持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚

二、名词解释
1.脏读:一个事务读取到了另一个事务未提交的数据操作结果
危险:因为有可能所有的操作都会被回滚
2.不可重复读(虚读):一个线程中的事务读取到了另外一个线程中提交的update的数据
3.幻读:一个线程中的事务读取到了另外一个线程中提交的insert的数据

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

三、隔离级别:
查看当前隔离级别: select @@tx_isolation;
修改隔离级别: set session transaction isolation level read uncommitted;

Read Uncommitted(读取未提交内容)
       所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
Read Committed(读取提交内容)
       这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
       这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了幻读问题。
Serializable(序列化) 
       这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。只要操作产生了锁,就不允许其他事务读取和修改

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

MyISAM是表锁结构 不支持事务 innodb一般是行锁表结构支持事务里边有 ,乐观锁,悲观锁 里有两种 共享锁(我在处理这行命令时 别人也能拿到数据),排它锁(在处理这条sql时 不允许别人查询 因为我要对他处理 会导致他人查询数据不准确)

原文地址:https://www.cnblogs.com/laowt/p/14375986.html