一个事务一个完整的业务逻辑,要不同时成功,要不同时失败,不可再分。只有DML(insert,delete,update)语句才会有事务一说,其它语句和事务无关!! 事务是如何实现的
提交事务:commit;语句
回滚事务:rollback;语句
回滚永远只能回滚到上次的提交点,提交事务后就不可进行回滚
mysql是默认自动提交事务的,即每执行一条语句就提交一次事务,而这时候失败不能执行回滚的
所以我们需要先一条命令 “START TRANSACTION”:手动开启事务
可以看到当前数据表中三条数据,我们这时手动开启事务,并添加三条数据
这时候我们是可以回滚事务的,因为这时的数据是在一个日志文件中,并没有持久化到数据库表中,即我们现在所看到的数据是在日志文件中的,数据库并不会持久化的去保存这一系列数据(三条insert语句),而我们说到回滚事务是在回滚到上一次的提交点,那上一次的提交点在哪?就在我们第一次查看到 的那三条数据
所以我们此时回滚事务,是会将数据表的数据回到上一次的提交点,即最开始的那三条数据
我们也可提交事务,提交事务后本次事务不可再次回滚,数据也将持久化到数据库表中
commit --提交事务 事务的四大特性 A: 原子性
说明事务是一次完整的业务逻辑,不可再分C: 一致性
再同一个事务中,所有操作要不同时成功,要不同时失败,以保证数据的一致性I: 隔离性
A事务与B事务之间具有一定的距离
A事务在操作一张表时,B事务也操作这张表会怎样?D: 持久性
事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘(数据库中,而不是日志文件)上的数据保存到硬盘上! 事务的隔离的级别
事务A与事务B之间中一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别。
这道墙越厚,表示隔离级别就越高
A事务可以读取到B事务未提交的数据。
存在问题:脏读现象读已提交
A事务只能读取到B事务提交之后的数据
解决了脏读现象,但是不可重复读
oracle数据库默认的隔离级别,这种隔离级别是比较真实的数据,每次读取的数据都是绝对的真实可重复读
A事务开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经改变,并且提交了,事务A读取到的数据还是没有发生改变。
解决了不可重复读的现象,但是存在幻觉读
mysql默认隔离级别就是可重复读!!!序列化读(最高的隔离级别)
这是最高的隔离级别,效率最低,也最安全,解决看所有问题。
表示事务排队,不能支持并发
查看事务隔离级别四种隔离级别展示