数据库的事务以及并发事务带来的问题

一.什么是事务?事务的四大特性?

事务是又一组SQL语句语句组成的逻辑处理单元。

四大特性:ACID

原子性(Atomicity)、 一致性(Consistency)、 隔离性(Isolation)、持久性(Durability

原子性(Atomicity)一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被 回滚 (Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性(Consistency)在事务开始和完成时,数据库中的数据都保持一致的状态,数据的 完整性约束没有被破坏。(事务的执行使得数据库 从一种正确状态转换成 另一种正确状态)。具体来说就是,比如表与表之间存在外键约束关系,那么你对数据库进行的修改操作就必需要满足约束条件,即如果你修改了一张表中的数据,那你还需要修改与之存在外键约束关系的他表中对应的数据,以达到一致性。

隔离性(Isolation)一个事务的执行不能被其他事务干扰。为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。( 在事务正确提交之前,不允许把该事务 对数据的任何改变提供给任何其他事务)。(事务处理过程中的中间状态对外部是不可见的)。隔离性通过 锁就可以实现。

持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,并不会被回滚。

二、并发事务会带来什么问题?

1、第一类更新丢失:A事务撤销时,把已提交的B事务的数据覆盖掉

2、第二类更新丢失:A事务提交时,把已提交的B事务的数据覆盖掉

3、脏读:A事务对一数据进行了修改,但尚未提交,B事务读取了A事物修改但未提交的数据。A事务发生异常,回滚了数据,那么此时B事务读取的数据就是脏数据

4、不可重复读:A事务内,多次读写同一数据,在A事务并没有结束,B事务对这数据进行了修改,那么A事务两次读取的数据可能就不一样的,这样就发生了同一事务内两次相同的查询读到的数据不一样。

5、幻读:不可重复读的重点是修改,幻读的重点在于新增或者修改,即在一个事物内读取出来的记录数不一样

避免以上问题的发生,最常用的就是封锁技术,如乐观锁和悲观锁

三、MYSQL事务的隔离级别

1、Read uncommitted (读未提交):

允许事务读取未被其他事务提交的变更可能出现脏读,不可重复读和幻读问题

2、Read committed (读已提交):

允许事务读取已经被其他事务提交的变更,可以避免脏读,可能有不可重复读和幻读的问题

3、Repeatable read (可重复读 MYSQL默认隔离级别):

确保事务可以从一个字段中读取到相同的值,在这个事务持续期间,禁止其他事务对着这字段进行更新,可以避免脏读和不可重复读,可能有幻读

4、Serializable (串行化):

所有事务一个接一个地串行执行,可以避免脏读、不可重复读、幻读

猜你喜欢

转载自www.cnblogs.com/liujunj/p/9001033.html