俗话说书上得来终觉浅,在回忆数据库事务相关知识时,在事务隔离性这块总是感觉没吃透,于是决定在mysql进行实战演练以加强知识的印象。
首先,介绍下数据库事务特性,简称ACID:
Atomic 原子性,事务中所有操作是一个整体要么全部完成,要么不做操作,不会有做到一半的情况。
Consistency 一致性,事务执行成功后,操作肯定是正确执行的,例如给你账户加100块,不可能结果给你加了50块。
Isolation 隔离性,各个事务之间是独立的。
Duration 持久性,事务完成后的操作做的修改是永久
我们这里重点讨论Isolation 隔离性,理解隔离性请以数据库单个事务为单位,一个事务中可以包含查询、修改等多个操作,以下为在mysql数据库进行的操作,先来了解几个操作时使用的命令:
#获取当前数据库事务隔离级别
SELECT @@tx_isolation;
#修改当前数据库事务隔离级别
#read-uncommitted 读未提交
#read-committed 读已提交
#REPEATABLE-READ 可重复读
#SERIALIZABLE
set tx_isolation = 'read-uncommitted';
#手动开启一个mysql事务,并在之后执行相关sql语句
START TRANSACTION #手动开启事务
ROLLBACK #回滚
COMMIT #事务提交
mysql下开两个窗口,将隔离级别设置为read-uncommitted 读未提交 ,试下事务A和事务B同时更新一条记录,到最后提交时,事务A执行成功COMMIT,但事务B执行失败进行ROLLBACK,观察回滚后记录信息。
以下为执行步骤,大家可以随便找个表试下,事务A和事务B分别在两个窗口中,并且设置了set tx_isolation = 'read_uncommitted';
#1.开启事务A
START TRANSACTION
#3.事务A更新用户年龄
UPDATE girl SET age = 44 WHERE id = 13;
#5.执行成功,提交
COMMIT
#2.开启事务B
START TRANSACTION
#4.事务B更新用户年龄
UPDATE girl SET age = 66 WHERE id = 13;
#6.执行失败,回滚
ROLLBACK
大家可以尝试的修改不同的隔离级别看看执行效果,便于大家对各个隔离级别的深入理解。