数据库事务

四大特性:ACID

  1、原子性(Atomicity,或称 不可分割性):一批操作,要么全部成功,要么全部不成功。

  2、一致性(Consistency):结果唯一、精确、无脏数据。

  3、隔离性(Los): 多个事务并发的时候,保证各个事务之间的隔离性。

  4、持久性(Durability): 将数据存入硬盘。

 

事务的隔离性:

隔离级别 脏读取 不可重复读 幻读
读未提交(Read  Uncommitted)  yes  yes  yes
读提交(Read Committed)  no  yes  yes
可重复读(Repeatable Read)  no  no  yes
串行化(Serializable)  no  no  no

 

 

 

 

 

 

 

 

脏读取:一个事务在执行过程中,读取了另外一个事务未提交的数据。

不可重复读:一个事务中多次查询结果不唯一。首次查询与再次查询间隔间,另外一个事务提交,导致的结果不一致。(修改或删除)

幻读:(数据的新增)

  事务a,执行查询操作,得到 3 条记录。

  事务b,执行查询操作,得到 3 条记录。

  事务b,执行 insert 操作,将一条记录插入表中,并提交事务。

  事务a,执行查询操作,由于隔离性(快照读取),结果依然为 3 条记录。当事务a,执行 insert 操作时,发现表中已经存在id = 4的记录了,就跟产生了幻觉一样。

 

mysql InnoDB MVCC (Multiversion Concurrency Control ,多版本控制)

  它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。

读锁:也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

写锁:又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。

行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。行级锁对系统开销较大,处理高并发不够好。InnoDB MVCC 比行锁性能好。

 

  InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID。

select   

  InnoDB会根据以下两个条件检查每行记录::
  a.InnoDB只会查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的.。
  b.行的删除版本要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除.。
  只有a,b同时满足的记录,才能返回作为查询结果。

update

  InnoDB会为删除的每一行保存当前系统的版本号(事务的ID)作为删除标识.。
  InnoDB执行UPDATE,实际上是新插入了一行记录,并保存其创建时间为当前事务的ID,同时保存当前事务ID到要UPDATE的行的删除时间。

delete,insert 可以根据上面的结论,进行推导。

 

oracle 中解决幻读使用的技术:undo (待补充。。。)

 

注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低。

posted @ 2018-10-24 16:49  陈标  阅读(129)  评论(0编辑  收藏  举报