一、事务
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;
三、隔离级别实战
----------------------------------------------------------------------读未提交--------------------------------------------------------------------
-------------------------------------------------------读已提交,不可重复读---------------------------------------------------------
读已提交,继续:
----------------------------------------------------------可重复读-------------------------------------------------------------
幻读。。。。。
---------------------------------------------------------------串行化-----------------------------------------------------------