事务:也称工作单元,是由一个或多个SQL语句组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。
通过事务的使用能防止数据库中出现数据不一致现象。如两个银行账户转账,涉及到两条更新操作,这两条更新操作只允许全部成功或失败,否则数据会出现不一致的现象。
事务特征可用四个字母的缩写表示的:即ACID
原子性(Atomicity)
事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
一致性(Consistency)
一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。
隔离性(Isolation)
一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户中取钱,通过事务的隔离性确保账户余额的正确性。
持久性(Durability)
也称永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。
MySQL的事务处理主要有两种方法
begin 开始一个事务
rollback 事务回滚 ==将当前状态回滚到事务开启的状态==
commit 事务提交
MySQL默认是自动提交的,也就是你提交一个sql,就直接执行。可以通过:
set autocommit = 0
禁止自动提交
set autocommit = 1
开启自动提交
但要注意当用set autocommit = 0
的时候,以后所有的sql都将作为事务处理,直到commit确认或rollback结束,注意当结束这个事务的同时也就意味着同时开启了另一个事务,而按第一种方法只将当前的作为一个事务。
A事务在开始执行之后并未提交数据,但是B事务却可以读到并未提交的数据,此时B事务就读到了一条“脏数据”,也叫做脏读。
事务A:查询数据并打印结果
事务B:在查询数据完之后,打印账单前,又对数据进行了修改
此时事务A就了事务B修改过后的数据,与之前查询的数据不相符,以为出现了幻觉。
事务A:查询数据
事务B:修改数据
事务A在查询完数据之后,事务B对数据进行了修改,此时事务A再去查询数据就得到的是事务B修改之后的数据。这就叫不可重复读。
事务A:查询数据,并打印账单
事务B:在打印账单的过程中,又对数据进行了更新
而在该级别下,在事务A开启时,数据库就会生成一个view(视图),后续事务A再对数据进行操作时就只是在操作view视图,并不是实际的数据库。而事务B是直接对数据库中的数据进行修改的。
可以防止脏读、幻读、不可重复读
事务A:更新数据
事务B:更新数据
在该级别下,会为每个数据库中的表都加上一把锁,A事务执行不完是不能执行B事务的。
缺点:在一个时间点只能有一个事务去访问表,从而降低了效率。
MySQL默认的隔离级别:可重复读
Oracle默认的隔离级别:读已提交
show variables like 'transaction_isolation';
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
{READ UNCOMMITED|READ COMMITED|REPEATABLE READ|SERIALIZABLE}
原文:https://www.cnblogs.com/liliHexiaogou/p/11478641.html