概念:
事务是逻辑上的一组操作,要么都执行,要么都不执行。
保证多个操作原子性,要么全成功,要么全失败。对于数据库来说事务保证批量的DML要么全成功,要么全失败。
事务的四大特性:
原子性(Atomicity):事务是最小的工作单元,不可再分。
一致性(Consistency):事务必须保证多条DML语句同时成功或同时失败。
隔离性(Isolation):一个事务不会影响其他事务的运行,互不干扰。事务之间隔离,四个隔离级别。
持久性(Durability):事务一旦提交成功,它对数据库中数据的改变就是永久性的
注意:rollback,或者commit后事务就结束了。
事务之间的隔离性:
第一级别:读未提交 (Read Uncommited)
对方事务还未提交,但当前事务可以读取到对方未提交的数据
读未提交存在脏读现象:表示读到了脏的数据,因为还未提交到硬盘,数据及其不稳定。(所有数据库都是从第二级别起步,第一级别太低)
脏读:本质是事务 B 去查询了事务 A 修改过的数据,但是此时事务 A 还没提交,所以事务 A 随时会回滚导致事务 B 再次查询就读不到刚才事务 A 修改的数据了,这就是脏读。
第二级别:读已提交 (Read Commited)
当前事务只能读取到对方事务已经提交的数据。由于未提交的读不到,则解决了脏读现象。
存在的问题:不可重复读,即可能每次读的数据不一样,做不到数据从头到尾查的数据是一样的。
第三级别:可重复读 (Repetable Read)
解决了不可重复读的问题
确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改(如银行总账)。每一次读的都是事务初始的备份数据,每次读结果都一样
存在的问题:读取到的数据是幻象读
幻象读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同
第四级别: 序列化(串行)读 (Serializable) (同步)
解决了所有问题
但是效率低,需要事务排队
每一个级别出现都解决了上一个级别存在的问题。
oracle数据库的默认隔离级别是:读已提交 (Read Commited)
mysql数据库默认的隔离级别:可重复读 (Repetable Read)