MySQL事务、隔离级别

 一、事务

1、原子性(Atomicity):不可分割的最小的工作单元,原子很多时候是最小的嘛,记得,事务是不可分割的;
2、一致性(Consistency):事务里面的sql语句,只能是同时成功,同时失败,这就是所谓的一直嘛;
3、隔离性(Isolation):一个事务的进行不能影响另外一个事务的进行,也就是说事务之间要隔离开来;
4、持久性(Durability):一个事务一旦提交之后,就再也不能回滚了,持久地保持这个样子。

--如果只是对某些语句需要进行事务控制,则使用START TRANSACTION 语句开始一个事务比较方便,这样事务结束之后可以自动回到自动提交的方式,
--如果希望所有的事务都不是自动提交的,那么通过修改AUTOCOMMIT 来控制事务比较方便,这样不用在每个事务开始的时候再执行START TRANSACTION 语句。

BEGIN; -- 开始一项新的事务(目测与START TRANSACTION是一样的)
START TRANSACTION; -- 开始一项新的事务(目测与BEGIN是一样的)
SET AUTOCOMMIT = 0; -- 0表示否,表示不要自动提交事务,也即是手动关闭事务
SET AUTOCOMMIT = 1; -- 1表示是,mysql默认的
ROLLBACK; -- 回滚事务
COMMIT; -- 提交事务

SHOW VARIABLES LIKE '%autocommit%'  -- 查看当前是否是自动开启事务

-- 查看以及设置当前会话的隔离级别
SELECT @@session.TX_ISOLATION; 
SELECT @@global.TX_ISOLATION; 
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

 二、MySQL事务隔离级别

读未提交(read-uncommitted):最低级的的错误“脏读”都扯上了(一个事务读到了另外一个还没有提交的数据),什么问题都不可以避免;

读已提交(read-committed)(Oracle默认):避免了脏读,也叫不可重复读,但还是跟可重复读(在一个事务里面,多次读到了其它事务对同一条数据的多次修改,读到的结果不一样)扯上了;

可重复读(repeatable-read)(MySQL默认):避免了不可重复读,但是避免不了幻读(事务A统计该表总条数的时候,事务B往该表插入一条数据,事务A统计完并提交并再次统计的时候,发现多了一条数据,这就是幻读),标准的sql情况下,一旦一个事务进行查询,就应该对这条进行锁住,另一个事务不能对该条数据进行修改,但是mysql并没有锁住该条数据;

串行化(serializable):效率低,没有并发可言,在串行化当中,如果开启了一个事务,并没有提交,则会把这种表给锁住,另外的事务只能对该表进行读操作的,不能对该表进行写操作,所以效率就低

--------------------额外的很不错的“可重复读”-------------------------

-- 在session1内,在同一个事务内(这个时间段内数据已经改变了),查看到的数据本来应该一样的,
-- 但是如果在"读已提交"的事务隔离级别内,就会看到不同的数据(haha),造成幻读,也叫不可重复读,因为一旦重复读,读到的数据就不一样了嘛
-- 如果在"可重复读"的隔离级别之内,就不会看到不同地方数据,也就是还是GXF
-- mysql 的隔离级别是可重复读,是因为采用了MVCC的方法

BEGIN
    1:00)SESSION1 
                    SELECT t.name from USER t WHERE t.id = 1;  -- GXF
    2:00)SESSION1
                    SELECT t.name from USER t WHERE t.id = 1;  -- GXF
                                                                                                                                3:00)SESSION2
                                                                                                                                                BEGIN UPDATE user set t.name = 'haha' WHERE t.id = 1; END;
    4:00)SESSION1
                    SELECT t.name from USER t WHERE t.id = 1;  -- ?
  5:00)SESSION1
                    SELECT t.name from USER t WHERE t.id = 1;  -- ?
COMMIT;

  三、隔离级别实战

 ----------------------------------------------------------------------读未提交--------------------------------------------------------------------

-------------------------------------------------------读已提交,不可重复读---------------------------------------------------------

 

读已提交,继续:

----------------------------------------------------------可重复读-------------------------------------------------------------

 幻读。。。。。

 ---------------------------------------------------------------串行化-----------------------------------------------------------

 

转载于:https://www.cnblogs.com/ericguoxiaofeng/p/8453702.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值