一、含义
事务:一条或多条sql语句组成一个执行单位, 一组sql语句要么都执行要么都不执行
二、特点(ACID)
原子性(atomicity,或称不可分割性)、
一致性(consistency)、
隔离性(isolation,又称独立性)、
持久性(durability)。
A 原子性: 一个事务是不可再分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
D 持久性: 一个事务一旦提交了,则永久的持久化到本地
三、事务的使用步骤
-
隐式(自动)事务:
没有明显的开启和结束,本身就是一条事务可以自动提交,比如insert. update、delete -
显式事务:具有明显的开启和结束
1. 使用显式事务:
- 开启事务
set autocommit=0;
start transaction;#可以省略
- 编写一组逻辑sql语句
注意: sql语句支持的是insert、update、 delete
设置回滚点:
savepoint回滚点名; - 结束事务
提交: commit;
回滚: rollback;
回滚到指定的地方: rollback to回滚点名;
1.演示事务的使用步骤
#开启事务
SET autocommit=0;
START TRANSACTION;
#编写一组事务的语句
DELETE FROM tab_id WHERE id=3;
#结束事务
COMMIT;#执行
#rollbakc; 回滚
SELECT * FROM tab_id;
2. delete和truncate在事务使用时的区别
#演示delete
set autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
#支持回滚
#演示truncate
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
不支持回滚
四、并发事务
- 事务的并发问题是如何发生的?
多个事务同时操作同一个数据库的相同数据时 - 并发问题都有哪些?
- 脏读:1个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
- 不可重复读:1个事务多次读取,结果不一样
- 幻读:1个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入”的数据
-
如何解决并发问题
通过设置隔离级别来解决并发问题 -
隔离级别
脏读 不可重复读 幻读
read unconnitted: 读未提交 X X x
read comnitted: 读已提交 √ X X
repeatable read:可重复读 √ √ X
serializable:串行化 √ √ √
x不能解决,√能解决
mysql中默认第三个隔离级别repeatable read
oracle中默认第二个隔离级别2
五、隔离级别命令
每启动一个mysql程序,就会获得一个单独的数据库连接.每
个数据库连接都有一个全局变量@@tx_ isolation, 表示当前的
事务隔离级别.
- 查看当前的隔离级别:
SELECT @@tx_isolation;
- 设置当前mySQL连接的隔离级别:
set session transaction isolation level read committed;
- 设置数据库系统的全局的隔离级别:
set session global transaction isolation level read committed;
回滚点savepoint的使用
SET autocommit = 0;
START TRANSACTION;
DELETE FROM tab_id WHERE id = 4;
SAVEPOINT a;#设置保存点
DELETE FROM tab_id WHERE id = 7;
ROLLBACK TO a;#回滚到保存点
SELECT * FROM tab_id;