事务(ACID)的特性
原子性(Atomicity) 一个事务不可再分割,要么都执行要么都不执行
一致性(Consistency) 一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性(Isolation) 一个事务的执行不受其他事务的干扰
持久性(Durability) 一个事务一旦提交,则会永久的改变数据库的数据
事务的并发问题
脏读:读到未提交更新数据,就是读到另一个事务未提交数据,就是脏数据
不可重复读:对同一记录两次读取不一致,因为另一事务对该记录做了修改
幻读:对同一张表的两次查询不一致,因为另一事务插入了一条数据
事务的隔离级别
隔离级别 脏读 不可重复读 幻读
未提交读(READ-UNCOMMITTED) √ √ √
已提交读(READ-COMMITTED) × √ √
可重复读(REPEATABLE-READ) × × √
可串行化(SERIALIZABLE) × × ×
Oracle 支持的 2 种事务隔离级别: READ-COMMITTED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ-COMMITTED
Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE-READ
查看隔离级别
SELECT @@[session.]tx_isolation; # 查看会话隔离级别
SELECT @@global.tx_isolation; # 查看全局隔离级别
设置隔离级别
SET [SESSION] TRANSACTION ISOLATION LEVEL 隔离级别; # 设置会话隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别; # 设置全局隔离级别
事务的使用
事务提交
SET autocommit = 0; # 关闭自动提交
START TRANSACTION; # 开启事务
INSERT INTO user(username, password) VALUES ('张三', '123'); # 执行SQL1
INSERT INTO user(username, password) VALUES ('李四', '456'); # 执行SQL2
COMMIT; # 提交所有
SET autocommit = 1; # 开启自动提交
事务回滚
1、回滚所有
SET autocommit = 0; # 关闭自动提交
START TRANSACTION; # 开启事务
INSERT INTO user(username, password) VALUES ('张三', '123'); # 执行SQL1
INSERT INTO user(username, password) VALUES ('李四', '456'); # 执行SQL2
ROLLBACK; # 回滚所有
SET autocommit = 1; # 开启自动提交
2、回滚至保存点
SET autocommit = 0; # 关闭自动提交
START TRANSACTION; # 开启事务
INSERT INTO user(username, password) VALUES ('张三', '123'); # 执行SQL1
SAVEPOINT a; # 设置保存点
INSERT INTO user(username, password) VALUES ('李四', '456'); # 执行SQL2
ROLLBACK TO a; # 回滚至保存点
SET autocommit = 1; # 开启自动提交