定义
· 一个最小的不可再分的工作单元
· 通常一个事务对应一个完整的业务
· 一个完整的业务需要批量的DML语句(Insert updatedelete..)语句共同完成
· 事务只和dml语句有关
· 需要多少dml语句与业务逻辑有关
举例
银行的转账业务,涉及两个账户的修改,所以要么都修改成功,要么都不修改
事务的四个特性(ACID)
原子性Atomicity | 事务是最小的工作单元,不可再分 |
一致性Consistency | 要求所有的dml语句必须同时成功或者同时失败 |
隔离性Isolation | 两个事务之间具有隔离 |
持久性Durability | 事务的保证,事务终结的标志(把内存的修改写到硬盘) |
事务中的术语
开启事务 | Start transation |
事务结束 | End transation |
提交事务 | Commit transation |
回滚事务 | Rollback transation |
与事务操作有关的重要sql
Commit rollback
工作过程
事务在进行的过程中,dml语句并不会修改数据库中的数据,只是记录在了历史操作中,在内存中记录了下来,只有事务成功结束才会修改硬盘数据,失败则不做任何修改。
事务结束的标志
· 提交(commit) 成功结束并修改了数据库
· 回滚(rollback) 以失败告终,dml语句全部清空
事务开启的标志
任何一条dml语句的执行都标志着一个事务的开启
mysql中手动开启事务
由于mysql数据库中,默认情况下事务是自动提交的,所以需要开启手动提交
手动提交事务:
Start transation;(或set autocommit=off;)
Blablabla……..(dml)
Commit;
事务的四个隔离级别(隔离性)
首先需要阐述什么是脏数据,什么是脏读,脏数据顾名思义是不好的数据,其概念出现在事务之中,是指一些毫无用处的数据,简言之是不该读到的数据,举个例子,两个事务a和b,a事务在读出数据库数据并进行了更新,但是由于a事务出现某种异常,需要回滚,但是b在a回滚之前读取了这个数据,那么b拿到的数据就是不准确的即被称为脏数据,这个行为就是脏读。
· 读未提交(read uncommited)(隔离性低)
事务b还没有提交的数据,事务a就可以读到,此时由于事务a并未结束,可能会进行回滚操作,因此这里读到的就有可能是脏数据,一般数据库隔离都高于这个级别。
· 读已提交(read commited)(中)(oracle默认级别)
事务b提交的数据事务a才能读到,避免了脏数据,但是会导致不可重复读,此处不可重复读理解为事务a读过数据之后,如果事务b更改了数据,事务a再去读,就会和之前读到的数据不同。
· 可重复读(repeatable read)(高)
事务b提交事务a也读不到,事务a可重复读,此时数据库近乎隔离开来,事务a单独保留数据库数据,就算事务b对原始数据库进行了修改,a事务仍能读取保存的这个未被更改的数据库数据。
· 串行化(serializable)(很高)
事务b操作数据库时,事务a只能排队,吞吐量太低,所以基本不用。
设置事务的隔离级别
· 修改my.ini配置文件,在mysqld下面添加
transation-isolation = read-uncommited(事务隔离级别的英语)
· 通过命令
Set [无/session/global] transation isolation level read-uncommited
查看事务的隔离级别(当前会话)
Select @@tx_isolation
Select @@session.tx.isolation
查看全局的隔离级别
Select @@global.tx.isolation