1.事务:
若干个操作指令的集合(DML,即若干个DML语句组成就是事务)
事物特点:集合中的操作要么一起成功,要么一起失败
所以才有commit/rollback ,即所有都成功了则提交,否则回滚
2.事务开启的标志:
set autocommit=0;
DML语句开始
3.事务结束的标志:
提交结束:
1.显示提交 commit
2.隐式提交
执行DDL语句后会自动提交
正常退出:quit命令等 会自动提交
回滚结束:
1.显示回滚 rollback
2.隐式回滚 异常退出,掉电,宕机等情况会自动回滚
4.事务的4大特性(ACID):原子性,一致性,隔离性,持久性
原子性 (Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。(转账)
一致性 (Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致(转账前后双方总余额和之前一致)。
隔离性 (Isolation):事务的执行不受其他事务的干扰,当数据库被多个客户端并发访问时,隔离它们的操 作,防止出现:脏读、幻读、不可重复读。
持久性 (Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,数据永久性改变;(删除后不可恢复)
5.隔离级别
1).对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
(1).脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
(2).不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
(3).幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
2). 数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
3). 一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱
SQL99定义4中隔离级别:
(1).Read Uncommitted 读未提交数据。
(2).Read Commited 读已提交数据。 (Oracle默认)
(3).Repeatable Read 可重复读。 (MySQL默认)
(4).Serializable 序列化、串行化。 (查询也要等前一个事务结束)
这4种MySQL都支持
(1)Oracle支持的隔离级别: Read Commited(默认)和 Serializable,以及Oracle自定义的Read Only三种。
(2).Read Commited读已经提交,意思是如果没有提交,其他人是读不到的。
级别越高越好,最高级别也就是(4).Serializable,三种不希望出现的读 都不会出现,但是这种没人用,因为是串行的,效率太低
Read Only:由于大多数情况下,在事务操作的过程中,不希望别人也来操作,但是如果将别人的隔离级别设置为Serializable(串行),但是单线程会导致数据库的性能太差。是应该允许别人来进行read操作的。
6.事务也是关系型数据库的特点,也就是关系型数据库一般都支持事务,非关系型的则不支持
7.控制事务
除了commit rollback外还有savepoint(保存点)
保存点,类似还原点,即可以使用回滚的方式恢复到那一时刻(保存的时刻)。如果都不是自己
要回滚的保存点,那就可以用rollback回到最初,也就是直接回滚到上一次commit的时候。
如果没有回滚,觉得事务结束了,则直接提交即可,代表当前的事务结束了。
使用示例:
savepoint aaa;
rollback to savepoint aaa;//回滚到保存点aaa
注意,
如果保存点设置名称重复,则会删除之前的那个保存点。
一但commit之后,savepoint将失效。
回退到某个保存点后,则不能在回退到该保存点之后的保存点了。也就是说,不会回退到比当前保存点更新的保存点。