事务精讲(面试重点)

事务的基本特征

        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,事务彻底的串行执行,解决了脏读,不可重复读,幻读

猜你喜欢

转载自blog.csdn.net/q322359/article/details/131827965