事务

一.什么是事务

      事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败;

二.mysql中的事务

     a.mysql引擎是支持事务的;

     b.mysql默认自动提交事务的,每条语句都处在独立事务中;

     c.手动控制事务

             开启事务 begin transaction

             回滚事务 commit

             结束事务 rollback

三.事务特性

     原子性   是一个不可分割的工作单位

    一致性    事务必须从一个一致性状态变换到另一个一致性状态, eg:转账 前后总额保持不变

    隔离性    每个用户操作事务,事务之间不会互相干扰

    持久性    事务一旦被提交就就会永远的改变数据库

四.事务的隔离级别

    脏读:                一个事务读取了另一个事务未提交的数据;

    不可重复读:       在一个事务中读取表中的一行数据时,多次读取结果不一样。一个事务读取了另一个事务提交完的数据(update)

    虚读                 在一个事务中读取到了另一个事务插入的数据,导致多次读取数据结果不一致(insert)

数据库通过设置事务的隔离级别防止以上情况的发生:

* 1READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。

      * 2READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)

      * 4REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)

      * 8SERIALIZABLE: 避免赃读、不可重复读、虚读。

        级别越高,性能越低,数据越安全

mysql中:

   查看当前的事务隔离级别:SELECT @@TX_ISOLATION;

   更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。

      设置隔离级别必须在事务之前

五.编写事务

时间

线程1

线程2

说明

t1

begin;

t2

select * from account where name='zs';

结果1000

t3

begin;

t4

update account set money=money+100 where name='zs';

t5

select * from account where name='zs';

结果1100

读到了另一个线程未提交事务的数据。赃读发生了

t6

commit;

t7

select * from account where name='zs';

结果1100

读到了另一个线程提交事务的update数据。不可重复读发生了

t8

insert into account values(4,'zl',1000);

执行insert语句插入数据,事务自动提交了

t9

select * from account;

查到4条数据

读到了另一个线程自动提交事务的insert语句数据。虚读发生了

t10

commit;

 
原文地址:https://www.cnblogs.com/fjkgrbk/p/transaction.html