为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步
同步和异步的区别和联系
一句话总结:同步就是一件事一件事的做,没做完不能做其他事。异步就是,可以做多个互不影响的事。
举例:
吃饭和说话就是同步,因为只有一张嘴。
吃饭的时候听歌,看电视,就是异步,互不影响。
并发测试工具:JMeter
数据库事务的隔离级别
脏读: 事务A读取了 被 事务B已修改但未提交的数据。假如B回退,则事务A读取的是无效的数据。
不可重复读 :在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的。
幻读:发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。例如:第一次查询有5条数据,执行第二次查询前,插入了一条数据,第二次查询时就有6条数据。
为了解决上述问题数据库提供以下四种隔离级别:
读未提交(Read Uncommitted) ps:可以读到未提交的内容, 一般不会去用的。
在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的,可能会产生“脏读”、“不可重复读”、“幻读”。
读提交(Read Committed)ps:只能读到已经提交了的内容, 各种系统中最常用的一种隔离级别。
可避免“脏读”,并不能避免“不可重复读”和“幻读”。
如需要加锁,需要显式的加锁,普通查询不会加锁。select * from Table where id = 1 for update
可重复读(Repeated Read)ps:专门针对“不可重复读”这种情况而制定的隔离级别。
当事务启动时,就不允许进行“修改操作(Update)”了,而“不可重复读”恰恰是因为两次读取之间进行了数据的修改,因此,“可重复读”能够有效的避免“不可重复读”,但却避免不了“幻读”,因为幻读是由于“插入或者删除操作(Insert or Delete)”而产生的。
串行化(Serializable)ps: 数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行。
这是数据库的最高隔离级别,可以有效避免脏读/幻读/不可重复读,但是效率奇差,性能开销大。

网友评论