事务:表示操作集合,不可分割,要么全部成功,要么全部失败,事务的开始取决于一个DML语句
事务的结束
1、正常的commit(使数据修改生效)或者rollback(将数据恢复到上一个状态)
2、自动提交,但是一般情况下要将自动提交进行关闭,效率太低
3、用户关闭会话之后,会自动提交事务
4、系统崩溃或者断电的时候回回滚事务,也就是将数据恢复到上一个状态
INSERT INTO EMP(EMPNO,ENAME) VALUES(2222,'ZHANGSAN');
--COMMIT;
--ROLLBACK;
SELECT * FROM EMP;
--SAVEPOINT 保存点
--当一个操作集合中包含多条SQL语句,但是只想让其中某部分成功,某部分失败,此时可以使用保存点
--此时如果需要回滚到某一个状态的话使用 ROLLBACK TO SP1;
DELETE FROM EMP WHERE EMPNO = 1111;
DELETE FROM EMP WHERE EMPNO = 2222;
SAVEPOINT SP1;
DELETE FROM EMP WHERE EMPNO = 1234;
ROLLBACK TO SP1;
COMMIT;
增删改是数据库的常用操作,在进行操作的时候都需要《事务》的保证
事务变得非常关键:
最主要的目的是为了数据一致性
如果同一份数据,在同一个时刻只能有一个人访问,就不会出现数据错乱的问题,但是在现在的项目中,更多的是并发访问
并发访问的同时带来的就是数据的不安全,也就是不一致
如果要保证数据的安全,最主要的方式就是加锁的方式,MVCC
事务的延申:
最基本的数据库事务
声明式事务
分布式事务
为了提高效率,有可能多个操作会在同一个事务中执行,那么就有可能部分成功,部门失败,基于这样的情况就需要事务的控制。
select * from emp where id = 7902 for update
select * from emp where id = 7902 lock in share mode.
如果不保证事务的话,会造成脏读,不可重复读,幻读。
事务的ACID属性
MySQL事务测试
▪ Commit表示事务成功地结束,此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都以交付实施。每 个Commit语句都可以看成是一个事务成功的结束,同时也是另一个事务的开始。
▪ Rollback表示事务不成功的结束,此时告诉系统,已发生错误,数据库可能处在不正确的状态,该事务对数据库的更新必须被撤
▪ 一旦执行了commit语句,将目前对数据库的操作提交给数据库(实际写入DB),以后就不能用rollback进行撤销。
▪ 执行一个 DDL ,dcl语句或从 SQL*Plus正常退出,都会自动执行commit命令。