事务隔离级别:在数据库 *** 作中,为了有效保证并发读取数据的正确性,提出了事务隔离级别。
1、未授权读取
也称为读未提交:允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写 *** 作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
2、授权读取
也称为读提交:允许不可重复读取,但不允许脏读取。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。可以通过“瞬间共享读锁”和“排他写锁”实现。
3、可重复读取
禁止不可重复读取和脏读取,但是有时可能出现幻读数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。可以通过“共享读锁”和“排他写锁”实现。
4、序列化
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询 *** 作的事务访问到。
数据库可以区分用户提交数据时候的语句会核发数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别
MySQL提供的四种隔离级别,通过设置transaction-isolation值来指定:
串行化:对于同一行记录,写和读都会加锁,当出现读写锁冲突时,会等待。避免脏读,不可重复读和幻读的发生。
可重复读:一个事务执行过程中,在启动时就会创建视图,所以这个事务总和它启动的时候看到的数据是一致的,核心是一致性读,事务更新数据时,只能使用当前读,如果当前记录行锁被占用,就需要进入锁等待。避免脏读,不可重复读的发生。
读已提交:它的视图是在每个sql语句开始执行的时候创建的,所以一个事务提交之后,他的变更才能被其他事务看到。可以避免脏读的发生。
读未提交:没有视图概念,所以一个事务还没提交时,他的变更就能被别的事务看到。任何情况都无法保证。
MySQL默认隔离级别为可重复读。
事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。事物的并发 *** 作中可能休闲脏读,不可重复读,幻读。
1、第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写 *** 作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据。
解决了更新丢失,但还是可能会出现脏读。
2、第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
解决了更新丢失和脏读问题。
3、第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据,这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务,写事务则禁止任何其他事务,这样避免了不可重复读和脏读,但是有时可能会出现幻读。
读取数据的事务可以通过“共享读镜”和“排他写锁”实现。
解决了更新丢失、脏读、不可重复读、但是还会出现幻读。
4、第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询 *** 作的事务访问到。
序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。
事务的基本要素(ACID)
1、原子性(Atomicity):事务开始后所有 *** 作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的 *** 作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张yhk中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
以上内容参考:事务隔离级别 - 百度百科
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)