事务的基本特征
1原子性
保证多个操作打包成一个整体,要么能够全都执行正确,要么一个都不执行
1.1为了维持事务原子性的特征,有了一个回滚的操作,因为我们并不知道事务中的操 作是否都能执行成功,当我们在执行事务的时候,执行到中间操作失败了,我们就需要把之 前已经成功执行的操作进行还原,还原回最初没有执行操作的模样,这个行为就叫做回滚。
1.2回滚是咋实现的:通过特定日志来记录事务中执行的每一步操作,如果操作发生错 误需要回滚,就直接按照之前操作的逆操作来执行就可以了
比如之前操作是删除,逆操作就是添加
之前操作是添加,逆操作就是删除
之前操作是修改,逆操作就是改回去
1.3思考:如果在回滚的过程中数据库挂了或者数据库服务器重启了,那么还能保证事 务的原子性吗?
由于是通过日志来记录事务的操作,而且日志中的数据是存储在硬盘当中的,所以即使 数据库挂了或者数据库服务器重启了,日志中记录的事务的操作也不会受到影响,当数据库 服务器重启了以后,还会根据之前没有执行完的回滚操作继续执行。,所以依然能够保证事 务的原子性
1.4事务的使用
开启事务:start transaction
执行多条sql语句
回滚或提交:rollback(手动回滚,表示全部失败)/commit(提交,表示全部成功, 带有回滚机制)事务必须以这两个结束。
但这里事务的使用在实际开发中并不常用,在实践开发中往往是通过程序代码来操作事 务
2一致性
事务执行之前和事务执行之后,数据要能对上
比如:你向你的朋友转账了500,那么你的账户就应该减500,你朋友的账户就应该加 500,而不是你的朋友的账户也减500,这样就乱套了。
3持久性
事务执行的各种操作都是持久生效的(最终写入硬盘中的),一旦事务执行成功进行提 交,事务产生的对数据的修改都是会写到硬盘中永久改变的
4隔离性
4.1 在并发执行事务的时候,隔离性会在数据可靠和执行效率之间做出权衡,隔离指的 是同时执行的事务之间的相互影响,隔离性越高,并发性越低,数据越可靠,性能越低。
4.2并发是什么意思:简单理解就是同时执行
因为数据库是服务器,所以就会在同一时刻给多个客户端提供服务,而多个客户端 就会给服务器提交事务,如果这多个客户端影响的是不同的数据库或者不同的表,那么就没 有什么问题,但是要是修改的是相同的表就会存在一些麻烦。
4.3并发操作会导致的一些问题
4.3.1脏读
当我正在写数据的时候,我还没有写好提交,但此时有个人来看了我正在修改 的这个数据,他看到的是我还没修改成功的数据,他看完了以后我修改成功了,那 他之 前看的数据就没用了,所以此时他读到的数据是脏数据,这个问题我们叫做脏 读
解决脏读:给写操作加锁,当事务A在写的时候,其他事务B就不能读了,直 到事务A写好数据提交事务,其他事务B才能来读取数据,此时事务B读到的就是正 确的数据不是脏数据了
4.3.2不可重复读
当别人正在读数据的时候,我就在对数据进行改变(开启另一个事务),我改 变了数据提交以后,正在读数据这个人发现数据突然改变了,和之前读到的数据不 同,在一个事务中可能会涉及到多次的读数据操作,而另一个事务将数据改变导致 在同一个事务中读到的数据不同,这是不合理的,这个问题我们叫做不可重复读
解决不可重复读:给读操作加锁,在事务A正在读取数据的时候,其它事务B 不能修改数据
4.3.3幻读
当别人正在读的时候,我新添加几条数据,这样就会导致虽然别人读的数据没 有改变,但是结果集不同了,比如别人读的时候读到的是10条数据,我添加了一 条,导致他下一次读取操作读到的是11条数据,结果集不同了。
解决幻读:串行化,彻底放弃并发执行事务,所有的事务都是一个挨一个的执 行(执行完一个事务才能执行下一个事务),此时并发性是最低的,隔离性最高, 效率最低,数据可靠性最高
MYSQL四种事务隔离级别:
(1).read uncommitted,允许读未提交的数据,(有脏读,不可重复读,幻读的问 题)
(2).read committed,允许读已经提交的数据(加了写锁),解决脏读,存在不可重 复读,幻读
(3).repeatable read,可以重复读取数据(加了写锁和读锁),解决了脏读,不可重 复读,存在幻读(默认的隔离级别)
(4).serializable,事务彻底的串行执行,解决了脏读,不可重复读,幻读