事务,何为?多个数据增删改操作的集合,目的为完成一项业务的处理。数据库中数据操作的最小单元是事务,而非以一个SQL语句为一个操作单元。这也就是说如果事务成功,其中的每一项操作都会生效,操作必须要完全应用到数据库,相反若是事务失败,其中每项操作都失败,不会对数据库起任何影响。而且在进行事务操作中,当前事务对数据的修改,只对当前连接可见。
这也就必须得说说事务的四个特性ACID了。A-原子性atomic,是指事务包含的所有操作要么全部成功,要么全部失败回滚(rollback)。C-一致性consistency,事务必须使数据库从一个一致性状态转换到另外一个一致性状态。这么说也许不是很明白,这就像一个人在两张银行卡之间转账,无论怎么转,两张卡的总金额依旧不变。I-隔离性isolation,也就是一个事务在进行中,另外一个事务不能操作相应的数据。D-持久性durability,即提交事务之后,数据持久生效。
对事务的操作,则主要有三种。开始事务,使用start transaction或者begin。提交事务使用commit关键字,而回滚事务则使用rollback。
在数据库中,有四大隔离级别,分别是read-uncommitted、read-committed、repeatable-read和serializable。以上隔离级别依次递增,而隔离级别越低,效率越高,数据访问冲突越多;隔离级别越高,效率越低,数据访问冲突越少。数据库的默认隔离级别为repeatable-read。若要设置隔离级别,则需要使用set tx_isolation='隔离级别名称'。在访问冲突问题上,一般会出现三种问题。一是脏读,读取到其他事务未提交的数据;二是幻读,即一个事务添加或者删除了数据,并提交,但是另外一个事务查询不到新数据或者依旧查询到已经删除的数据;三是不可重复读,即再次查询的数据与第一次查询的数据不一致。
最后我们来看看不同的隔离级别会对应哪些数据访问冲突现象:
事务之特性,小小的知识点,记之无害,而不知则惘。即使只是平时和项目经理的交流中,也应时刻注意,不可夸大其词,知之为知之,不知为不知 。而最终所需到达的境界,则为问无不知,答无不尽。