一、定义:
单个逻辑工作单元中的一组操作,要么都执行,要么都不执行
二、特点:
性质 | 说明 |
A 原子性 | 事务是一个整体,不可分割 |
C 一致性 | 事务使数据的状态在操作前后保持一致 |
I 隔离性 | 多个事务在操作相同数据库时不受其他事务的干扰 |
D 持久性 | 一个事务一旦提交了,数据的改变就是永久性的 |
三、开启事务和结束事务
1、mysql默认是自动提交,执行一句就提交一句。
即默认情况下,每一条sql都是一个独立的sql。
2、手动提交事务:
(1)set autocommit=false;
接下来所有语句都必须手动提交,否则就不会永久生效
(2)start transaction;
.....
commit; 或 rollback; 或发生异常;
3、注意:事务的回滚只对DML语句有效,对于DDL语句无效。
4、事务回滚举例:
四、事务的并发问题
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。之后, 若 T2 回滚, T1读取的内容就是临时且无效的。
不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段。之后, T1再次读取同一个字段, 值就不同了。
幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入/删除了一些新的行。之后, 如果 T1 再次读取同一个表, 就会多/少几行。
五、事务的隔离级别
脏读 | 不可重复读 | 幻读 | |
read uncommitted:读未提交 | × | × | × |
read committed:读已提交 | √ | × | × |
repeatable read:可重复读 | √ | √ | × |
serializable:串行化 | √ | √ | √ |
mysql中默认 第三个隔离级别 repeatable read
oracle中默认第二个隔离级别 read committed
设置隔离级别:
set session|global transaction isolation level 隔离级别名;
查看隔离级别:
select @@tx_isolation;
Mysql支持事务的引擎:innodb 和 bdb