事务
- 概念:作为单个逻辑工作单元来执行一系列SQL语句
- 主要作用:确保数据库的完整性
事务的4大特性
-
原子性(Atomicity):要么全做,要么不做
-
一致性(Consistency):跟业务流程保持一致,总量保持不变
-
隔离性(Isolation):事务与别的业务彼此保持独立
-
持久性(Durability):持久化操作
MVC架构
-
MySQL:自动提交commit
Oracle:手动提交 不只是commit
-
开始事务:第一条SQL语句
-
事务的过程:DML
-
事务结束:提交结束
(1)显示提交:commit DML
(2)隐式提交(自动提交):
a.正常退出exit(ctrl+c)
b.DCL语句
c.DDL语句
(3)回滚
a.显示回滚 rollback
b.隐式回滚 异常退出
commit
事务的生命周期
事务的保存(Savepoint)
-
类似: 游戏 关卡
-
事务-保存点(Savepoint)
用于回滚时,如果想要撤回刚刚的操作,可以在这些操作之前设置一个保存点,在需要撤回时使用rollback进行回滚
-
语法:
(1)savepoint 保存点名称
(2)rollback to savepoint 回滚到保存点位置
-
打开mytab表
-
插入一条数据:
-
创建保存点
-
在插入一条数据
-
回滚到保存点
-
全部回滚
事务的隔离级别
-
多个事务(客户端)产生的问题
-
脏读:
事务1(客户端1)正在修改数据,没有提交commit,此时事务2(客户端2)也访问此数据,获取到的过时数据,就是脏读数据
-
不可重复读(针对列):
在一个事务中多次查询得出的数据不同,即别的事务已经修改了数据
即事务2拿到了事务1修改后并提交后的数据
-
幻读(针对表):
一个事务中使用相同条件的查询语句多次查询其结果不同
还有一种情况:两个事务都是修改了数据
隔离级别
-
注:高并发、多线程 本身就与事务隔离相矛盾
-
MySQL:四种隔离级别都有
Oracle:只有Serializable|Read Committed;
set transaction isolation level Serializable|Read Committed;
set transaction read only ; //只读级别
注:设置隔离级别时要再事务的SQL语句之前设置
很少使用:只读Read Committed ,Serializable
经常使用:Read Committed
-
事务的隔离级别
-
设置隔离级别:
(1)set transaction isolation level Serializable|Read Committed;
(2)set transaction read only ; **//**只读级别