首页 > MySQL > 事务并发处理

事务并发处理

前几天和同事讨论,老夫自以为对事务有了一定的了解,但当讨论的时候发现还是有些说不明白,所以周末的时间,又看了一遍带我入门北京尚学堂马士兵老师关于事务的讲解,这次做一下笔记,以供以后忘了的时候查询方便。这里默认读者对事务的ACID都有了了解,直接说事务并发时可能出现的问题和数据库的事务隔离级别

1. 事务并发时可能出现的问题

说这个问题记得大学课堂上有一个很经典的例子就是:银行的存取款,这里也用这个例子说明(因为不知道wp博客怎么搞表格和怎么支持MD,所以就搞几张图片吧)

①. 第一类丢失更新(Lost Update)

第一类丢失更新

②. dirty read脏读(读到了另一个事务在处理中还未提交的数据)

脏读

③. non-repeatable read 不可重复读

不可重复读

④. second lost update problem 第二类丢失更新(不可重复读的特殊情况)

第二类丢失更新

⑤. phantom read 幻读

幻读

看到这里可能会有读者对不可重复读和幻读有所迷惑,这两者有什么区别吗?不都是受另一个事务的影响,导致前后结果不一致吗?其实仔细看区别还是很明显的:幻读是关于数据库的delete和insert导致前后的数据不一致,而其他的情况都是数据的更新导致前后的数据不一致

2. 数据库的事务隔离机制

其中在文档java.sql.Connection中有详细的说明,除了none(没有事务)之外,还有:1:read-uncommitted 2:read-committed 4:repeatable read 8:serializable(数字代表对应值)四种。
为什么取值要使用 1 2 4 8 而不是 1 2 3 4
1=0000 2=0010 4=0100 8=1000(位移计算效率高)

需要说明的是:

只要数据库支持事务,就不可能出现第一类丢失更新
read-uncommitted(允许读取未提交的数据) 会出现dirty read, phantom-read, non-repeatable read 问题
read-commited(读取已提交的数据 项目中一般都使用这个)不会出现dirty read,因为只有另一个事务提交才会读出来结果,但仍然会出现 non-repeatable read 和 phantom-read;使用read-commited机制可用悲观锁 乐观锁来解决non-repeatable read 和 phantom-read问题
repeatable read(事务执行中其他事务无法执行修改或插入操作 较安全)但仍然会出现phantom-read
serializable解决一切问题(顺序执行事务 不并发,实际中很少用)

3. MySQL默认事务级别

查看MySQL的默认事务级别


select @@tx_isolation;

参考资料:北京尚学堂马士兵老师hibernate视频教程

分享到:

作 者: Bridge Li,http://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/356
版权声明:本站作品如非特殊声明均为原创,转载时请注明作者和原文链接,谢谢。
分类: MySQL 标签: , ,
  1. 本文目前尚无任何评论.