一、什么是事务
事务是Mysql保证数据一致性的关键技术。事务可以包含多个操作,这组操作需要全部执行成功,只要有一个操作失败,则整个事务操作全部失败。数据要么是原样,要么是操作全部执行成功后的状态,不存在部分操作执行成功而导致的中间状态。事务满足ACID四大特性。
1.原子性
原子性强调事务的不可分割,一组事务可能有多个操作,每个操作执行是独立的,执行过程中又面临着未知的问题,Mysql需要保证它们在逻辑上对外是原子的。一个经典的例子是转账,A转给B一百元。A的账户减少一百,B的账户增加一百,这两个操作或者说两条SQL需要满足原子性。要么都执行成功,要么都不执行,否则就会导致数据不一致。A的账户减少了一百,B的账户却没有增加一百,这种情况是不允许出现的。
2.持久性
事务一旦提交成功,数据就能持久化保存,即使出现断电宕机,重启后数据依然存在且保持一致性。
3.隔离性
隔离性是说各个并行事务间的可见性。Mysql是多线程处理客户端请求的,在事务并发执行的场景下,涉及数据一致性的问题。mysql有四种事务隔离级别,以保证数据的一致性。隔离级别越高,数据的一致性越强,但事务的并发性越低。
读未提交(Read Uncommitted)
读取到其他事务未提交的数据。该隔离级别下会造成脏读。事务A读取到事务B未提交的数据,B事务回滚了,这就造成了脏读。在实际工作中是不允许出现脏读的,该隔离级别不实用。
读已提交(Read commmitted)
读取到其他事务已提交的数据。该隔离级别解决了脏读,但是不能解决不可重复读,在同一事务中对同一记录读取多次,可能读到不同的结果。(记录被别的事务修改了)
可重复读(Repeatable Read)
在同一事务中,先后多次读取同一数据,结果都是一致的。(尽管记录可能被修改了,但读取到的仍然是第一次读取到的值。)在InnoDB引擎