javaweb基础之mysql回溯笔记(二)

文章目录

  • mysql的事务
    • 定义
    • 四大特性
  • 并发事务问题
  • mysql中事务隔离级别
    • 隔离级别分为:
    • 解释


mysql的事务

定义

指对数据库的一组操作,要么都执行要么都不执行;

老实说,对事务的定义,其实还是很模糊的概念,这里留下个坑;等我以后真正见识过事务,再来定义什么是事务!

四大特性

原子性
英文名为:Atomicity

解释为:
事务中的所有操作都是不可分割的原子单位,SQL语句要么都成功要么都失败;


一致性
英文名为:Consistency

解释为:
事务执行后,其数据库的状态和其它业务规则保持一致;


隔离性
英文名为:lsolation

解释为:
在并发操作中,不同事务之间应该隔离开来,并发事务之间不干扰

持久性
英文名为:durability

解释为:
事务提交之后,对数据库的修改应该是永久的,其结果记录在存储设置中;

注意:
所有的特性都是为了一致性而存在,无论是原子性,隔离性,还是持久性,其最终的目的都是为了实现了事务的一致性,即数据库的状态是跟其它的业务规则保持一致的!

并发事务问题

两类更新问题,三类读取问题

更新问题来自于文章:
a.并发事务更新问题

两类更新问题如下:

第一类丢失更新 :
A,B 事务同时操作同一数据,A先对改数据进行了更改,B再次更改时失败然后回滚,把B更新的数据也回滚了。(事务撤销造成的撤销丢失)

5)第二类丢失更新
A,B事务同时操作同一数据,A先对改数据进行了更改,B再次更改并且提交,把B提交的数据给覆盖了。(事务提交造成的覆盖丢失)

读取问题如下:
脏读:

事务B读取了事务A未提交的数据;也就是读取了未在数据库提交的数据;

不可重复读:

事务B第一次读取数据S,在事务B第二次读取数据S之前,也就是还未提交数据S的时候;事务A对数据S进行了修改,并且提交成功;这时事务B读取到了两次不同的数据;其不同的数据是在于数值改变了;

幻读:

事务B第一次读取数据S,在事务B第二次读取数据S之前,也就是还未提交数据S的时候;事务A对数据S进行了增加或者删除的操作,并且提交成功;这时事务B读取到了两次不同的数据;其不同的数据是在于表记录改变了;

mysql中事务隔离级别

详情参考来自于博文:
b.关于事务的隔离级别和事务特性文章

隔离级别分为:

1.read uncommitted(读未提交)
2.read committed(读已提交)
3.repeatable read(重复读)
4.serializable(序列化)

其隔离级别由低到高为:
1<2<3<4
读未提交<读已提交<重复读<序列化

解释

  1. Read UnCommitted(读未提交)
    最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。

  2. Read Committed(读提交)
    大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果

  3. Repeatable Read(重复读)
    mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。

  4. Serializable(序列化)
    最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。

以上解释的内容均引用于提到博文b:

理解:

在四大隔离级别中:
1.最低级别的read uncommitted,连未提交的数据都会读取,那么很明显脏读也就防止不了,脏读是对未提交的数据都读取,至于不可重复读和幻读肯定也防止不了。。。
可防止的并发访问:


2.第三的级别是read committed,读已提交的数据;不可重复读和幻读都是已提交的数据被读取到,所以这个是防止不了不可重复读和幻读的;
可防止的并发访问:
脏读

3.第二级别是repeatable read,可重复读;都说了可重复读,那么肯定可以防止不可重复读;
可防止的并发访问:
脏读,不可重复读

4.第一级别是Serializable,对同一数据是依顺序的串行访问的
可防止的并发访问:
脏读,不可重复读,幻读

你可能感兴趣的:(web基础)