关于事务
事务: 1、一个最小的不可再分的工作单元。 2、通常一个事务对应一个完整的业务(例如:银行账户转账业务,该业务就是一个最小的工作单元)。 3、而一个完整的业务需要批量的DML语句(insert、update,delete)共同联合完成。 4、事务只和DML语句有关系,或者说DML语句才有事务。 5、以上所描述的批量的DML语句有多少DML语句,这个和业务逻辑有关系,业务逻辑不同DML语句的个数也不同。
例如:
t_act 账户表
actNobalanceact-100150000.00act-100280000.00执行转账操作:10000元
update t_act set balance=40000.00 where actNo='act-1001' update t_act set balance=90000.00 where actNo='act-1002'1、以上的两条DML语句要求必须同时成功,或者同时失败,最小单元,不可再分 2、当第一条DML语句执行成功之后,并不能将底层数据库中第一个账户的数据修改,只是将操作记录了一下,这个记录是在内存中完成的,当第二条DML语句执行成功之后,和底层数据库文件中的数据完成同步,若第二条DML语句执行失败,清空所有的历史操作记录,要完成以上的功能,必须供助事务。 3、事务可以保证多个操作原子性,要么全成功,要么全失败,对于数据库中来说,事务保证批量的DML要么全成功,要么全失败
在mysql中,事务默认是自动提交的,也就是说,只要执行一务DML语句,就开启了事务,并且提交了事务
1、查看关闭和开启变量的状态
show variables like '%commit%';2、关闭自动提交
set autocommit=off //或者 set session autocommit=off3、打开自动提交
set autocommit=on //或者 set session autocommit=on这种打开和关闭自动提交机制,只对当前会话有效。
隔离性有四个级别 1、read uncommitted 读未提交;
事务A和事务B,事务A未提交的数据,事务B可以读取到这里读取到的数据,可以叫做 ‘脏数据’,或者叫做 ‘Dirty Read’这种隔离级别是最低级别,这种级别一般在理论上存在的,数据库默认隔离级别一般都高于该级别的2、read committed 读已提交;
事务A和事务B,事务A提交的数据,事务B才可以读取到这种级别高于上面的读未提交。也就是说,对方事务提交之后的数据,我当前事务才能够读取到,这种隔离级别可以避免脏数据。这种隔离级别会导致:‘不可重复读取’ 3、repeatable read 可重复读;事务A和事务B,事务A提交之后的数据,事务B读取不到事务B是可重复读取数据的这种隔离级别高于读已提交也就是对方提交之后的数据我还是读取不到。这种隔离级别可以达到可重复读取。mysql默认是:可重复读虽然可以达到可重复读的效果,但是会导致:“幻象读” 4、serializable 串行化;事务A和事务B,事务A在操作数据库表中的数据的时候,事务B只能排队等待。这种事务隔离级别一般很少使用,吞吐量太低、用户体验不好这种隔离级别可以避免 “幻象读”,每一次读取的都是数据库中的真实数据事和A和事务B不再并发。