MySql事务介绍

一、什么是事务:

              事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部执行成功,要不全部不成功。MySQL默认自带事务,

       但是MySQL自带的事务是一条语句独占一个事务,如果想多条sql放在一个事务中执行,则需要使用数据库事务的命令:

      

二、数据库事务的命令:

     ① start transaction  开启事务

     ② rollback  回滚事务,取消这个事务

     ③ commit  提交事务

三、事务的四大特性(ACID):

      1、原子性(Atomicity):事务是一组不可分割的单位,要么同时成功要么同时不成功。

      2、一致性(Consistency):事务前后的数据完整性应该保持一致。(数据库的完整性:如果数据库在某个时间点下,所有

           数据都符合所有的约束,则称数据库为符合完整性的状态)

      3、隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多

           个并发事务之间数据要相互隔离。

      4、持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久的,无法再回滚,且接下来

            即使数据库发生故障也不会对其有任何影响。

四、事务的四大隔离级别:

            本质就是多个线程操作同一个资源造成的多线程并发安全问题,加锁可以非常完美的保证隔离性,但是这会造成数据库性

       能大大的下降。根据实际情况分三种类型

       1、如果两个事务并发修改:必须隔离;

       2、如果两个事务并发查询:不用隔离;

       3、如果一个事务修改,另一个事务查询:会出现以下三种情况

           ① 脏读:一个事务读取到另一个事务未提交的数据(本质是事务之间不隔离);

           ② 不可重复读:一个事务多次读取同一条记录,读取结果不相同(本质是一个事务读取到另一个事务已经提交的数据,事

                务查询不加行锁);

           ③ 虚读/幻读:一个事务多次查询整表的数据,由于其他新增或删除记录造成多次查询出的记录条数不同(本质一个事务

                读取到另一个事务已经提交的数据,事务查询不加表锁);

        因此,对于以上三种分类数据库给事务设置了四种隔离级别:

         1、read uncommitted:不做任何隔离,具有脏读、不可重复读、虚读(幻读)问题;

         2、read committed:可以防止脏读,不能防止不可重复读、虚读(幻读)问题;

         3、Repeatable read:可以防止脏读、不可重复读,不能防止虚读(幻读)问题;

         4、serializable:数据库运行在串行化模式下,所有问题都没有,但性能最差。

        #补充:

         ① MySQL默认事务隔离级别为Repeatable read;

         ② 隔离级别安全性比较:

              serializable>Repeatable read>read committed>read uncommitted

         ③ 隔离级别性能比较:

              serializable

         ④ 使用数据库的时候,根据自己想要防止的问题,选择一个能够防止问题的隔离级别中性能尽量高的一个;

         ⑤ 修改当前隔离级别:

              set [session/global] transaction isolation level 隔离级别;

         ⑥ 查询当前数据库隔离级别:

              select @@tx_isolation;












你可能感兴趣的:(MySQL,MySql事务)