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