MySQL_基础_TCL事务控制语言
事务(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; # 开启自动提交