mysql数据库事务

mysql数据库事务遵循四大原则:ACID。即:

1、原子性(atomicty)

事务内的操作要么全部执行,要么全部不执行。

2、一致性(consistence)

事务执行前后都会保持一个一致性状态,即从一个一致性状态变为另一个一致性状态。如执行A像B转账1000,执行前A有2000块,B有1000块,总数3000,执行后A有1000,B有2000,总数3000。

3、隔离性(isolation)

多个事务并发执行,可以保证互不影响。

4、持久性(durability)

一个事务一旦提交,对数据的修改就是永久性的,即使数据库发生故障,也不会出现数据异常。

我们现在重点讨论数据库事务的隔离,如果没有隔离机制将会发生以下几种问题:

1、脏读

如:字段x=50,事务A读取字段x,同时事务B执行x+50的操作,此时事务A读取到的值为x=100,但事务B执行后续操作失败了,事务B执行的所有操作全部回滚,x恢复值50,但事务A却读取到了错误值100,就发生了脏读。

2、不可重复读

如:字段x=50,事务A执行了多次读取x值的操作,事务B在事务A读取值的同时对x执行赋值操作。第一次:事务A读取x=50,事务B执行x=x+50;第二次:事务A读取x=100。

在某些情况下,不可重复读并不是一个问题,因为多次查询当然要以最新的数据为准。但是,一个事务查询范围内,对同一个字段多次查询却返回了不同的值,会存在一定的误导性。

3、幻读(虚读)

如:事务A对所有行的字段x执行x=10的操作,但这个时候事务B插入了一条新的数据,这条数据x=20,最后查询结果的时候就会出现有一条数据没有修改掉的错觉。

数据库事务的四大隔离等级,从前往后隔离性依次升高:

1、未提交读(read uncommited)

事务A能读取到其他事务未提交的执行结果。

2、提交读(read commited)

事务A只能读取到其他事务提交了的执行结果。

3、可重复读(repeatable read)

事务A可重复读取同一个数据,其他事务提交的修改不会对事务A产生影响。mysql事务默认的隔离级别。

4、串行(serializable)

最高隔离级别,所有事务依次串行执行。
 

mysql使用事务的引擎为innoDB

你可能感兴趣的:(mysql)