一.事务ACID特性
原子性( atomicity ):
原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。
一致性( consistency ):
根据定义,一致性是指事务执行前后,数据从一个 合法性状态 变换到另外一个 合法性状态 。这种状态 是 语义上 的而不是语法上的,跟具体的业务有关。
隔离型( isolation ): 事务的隔离性是指一个事务的执行 不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对 并发 的 其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
二.事务的状态
最终状态只有中止或提交
三.事务的使用
1.显示事务
步骤1: START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务。
START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符 :
① READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不
能修改数据。
② READ WRITE :标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作既可以读取数据,
也可以修改数据。
③ WITH CONSISTENT SNAPSHOT :启动一致性读。
步骤 2 : 一系列事务中的操作(主要是 DML ,不含 DDL )
步骤 3 : 提交事务 或 中止事务(即回滚事务)
2.隐式事务
如果我们想关闭这种 自动提交 的功能,可以使用下边两种方法之一:
显式的的使用 START TRANSACTION 或者 BEGIN 语句开启一个事务。这样在本次事务提交或者回
滚前会暂时关闭掉自动提交的功能。
把系统变量 autocommit 的值设置为 OFF ,
tips:
当我们设置 autocommit=0 时,不论是否采用 START TRANSACTION 或者 BEGIN 的方式来开启事
务,都需要用 COMMIT 进行提交,让事务生效,使用 ROLLBACK 对事务进行回滚。
当我们设置 autocommit=1 时,每条 SQL 语句都会自动进行提交。 不过这时,如果你采用 START
TRANSACTION 或者 BEGIN 的方式来显式地开启事务,那么这个事务只有在 COMMIT 时才会生效,
在 ROLLBACK 时才会回滚。
四.事务的隔离级别
Ⅰ数据并发问题
1.脏写
对于两个事务 Session A 、 Session B ,如果事务 Session A 修改了 另一个 未提交 事务 Session B 修改过 的数 据,那就意味着发生了 脏写
2.脏读
对于两个事务 Session A 、 Session B , Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。之后若 Session B 回滚 , Session A 读取 的内容就是 临时且无效 的。
3.不可重复读
对于两个事务 Session A 、 Session B , Session A 读取 了一个字段,然后 Session B 更新 了该字段。 之后
Session A 再次读取 同一个字段, 值就不同 了。那就意味着发生了不可重复读。
4.幻读
对于两个事务 Session A 、 Session B, Session A 从一个表中 读取 了一个字段 , 然后 Session B 在该表中 插 入 了一些新的行。 之后 , 如果 Session A 再次读取 同一个表 , 就会多出几行。那就意味着发生了幻读。
Ⅱ
四种隔离级别
READ UNCOMMITTED :读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结 果。不能避免脏读、不可重复读、幻读。
READ COMMITTED :读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做 的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL 默认的)。可以避免脏读,但不可 重复读、幻读问题仍然存在。
REPEATABLE READ :可重复读,事务 A 在读到一条数据之后,此时事务 B 对该数据进行了修改并提 交,那么事务A 再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍
然存在。这是 MySQL 的默认隔离级别。
SERIALIZABLE :可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避 免脏读、不可重复读和幻读。


Ⅲ设置隔离级别
方式一:
SET [ GLOBAL | SESSION ] TRANSACTION ISOLATION LEVEL 隔离级别 ;
# 其中,隔离级别格式:
> READ UNCOMMITTED
> READ COMMITTED
> REPEATABLE READ
> SERIALIZABLE
方式二:
SET [ GLOBAL | SESSION ] TRANSACTION_ISOLATION = ' 隔离级别 '
# 其中,隔离级别格式:
> READ - UNCOMMITTED
> READ - COMMITTED
> REPEATABLE - READ
> SERIALIZABLE