MySQL 事务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 事务相关的知识,希望对你有一定的参考价值。
银行引用是事务的一个经典例子:假如银行有两张表,一张支票表,一张储蓄表,现在需要从Jones用户的支票账户转移200¥ 至储蓄账户,那么至少需要三步:
1. 检查Jones的支票账户余额是否大于200¥
2. Jones的支票账户-200¥
3. Jones的储蓄账户+200¥
上述三步可组成一个事务,当2、3步故障时,之前执行的操作会自动回滚,保证数据的一致性。
一、mysql事务
MySQL事务是一组SQL语句或一个独立运行的工作单元并且满足ACID测试。
ACID测试:
A.atomicity,原子性,一个事务必须作为不可分割的最小单元,事务中的语句要么都执行成功,要么都执行失败。
C.consistency,一致性,数据库总是从一个一致性状态到另一个一致性状态(数据库的结果是一致的,所有事务中SQL语句共同修改后的结果)不可能因为系统奔溃出现上述支票表-200¥而储蓄表未+200¥,未提交的事务并不会保存至数据库中。
I. isolation ,隔离性,当前事务操作过程对于另一个线程事务的可见度,由隔离级别决定。
D. durability , 持久性 , 所有事务提交后都永久存放于数据库中。
隔离级别:
1. READ UNCOMMITTED (读未提交)
2. READ COMMITTED(读提交)
3. REPEATEABLE READ(可重复读)
4. SERIALIZABLE(序列化)
各个隔离级别可能产生的问题:
a.脏读,可以读取另一个线程事务未提交修改的数据。
b.不可重复读,当前事务多次读取(查询)的结果不一致。
c.幻读,当别的线程事务修改数据提交后,本线程未操作数据,但本事务提交后数据将改变,这就是幻读。
当别的线程事务修改数据提交后,本线程看到的数据未改变,本事务提交后数据将改变,这就是幻读。
d.加锁读,你懂得。
事务相关的命令:
START TRANSACTION #开启事务
ROLLBACK #回滚事务
COMMIT #提交事务
SAVEPOINT identifier #事务语句过多时,可以创建一个保存点,单独还原至此点
ROLLBACK [WORK] TO [SAVEPOINT] identifier #还原事务至此点
RELEASE SAVEPOINT identifier #删除保存点
二、验证各事务隔离级别存在的问题:
1. READ UNCOMMITTED a.首先需要关闭事务自动提交功能
b.修改事务隔离级别为READ-UNCOMMITTED
c.开启事务功能
d.在一线程事务中修改数据但不提交,在另一线程查看数据已更改,这就是脏读,存在脏读就必然存在不可重复读、幻读问题。
2. READ COMMITTED a. 修改事务级别为 READ-COMMITTED .
b. 开启事务,并在一线程中删除数据,另一线程查看发现数据已更改,这就是不可重复读。
-
REPEATEABLE READ
MySQL采用间隙所防止幻读,插入数据时被锁定了,无法演示。 - SERIALIZABLE
以上是关于MySQL 事务的主要内容,如果未能解决你的问题,请参考以下文章