·事务简介:事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功要么同时失败。
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
如例,正常结果应出现如下:
结果出现异常如下:
即张三转账给李四,出现异常后,张三转出去的1000没到李四账户上就罢了,张三的这1000还不见了,那怎么避免这种情况?
把这些语句整合到一个事务里,因为事务有回滚功能,一个事务里李四增加这1000失败,那就一起失败,即张三这1000转失败即还是2000。
·事务操作
方式一:
·查看/设置事务提交方式:
select @@autocommit;(查看事务提交方式是自动还是手动)
set @@autocommit=0; (如果是自动可以改为手动,1即为自动,0即为手动)
方式二:
·开启事务:
start transaction 或 begin;
(也是手动提交事务,也是只要你还没提交,数据库的数据就不会发生变化)
·提交事务:
commit;
·回滚事务:(如果我们执行指令过程中出现异常提示(这时候先别提交事务),执行回滚)
rollback;
·事务四大特性(ACID):
·原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败
·一致性:事务完成时,必须使所有的数据都保持一致状态(比如刚开始张三李四都是2000,结束后张三3000,李四1000,加起来还是4000,这就是一致性)
·隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行(比如串行化,没有幻读,比如你第一个事务在查询这个数据时,另一个事务也要修改这个数据,这时候就修改不了这个数据,得等第一个事务提交后才能修改这个数据)
·持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
不仅要能记住这四大特性,还要知道这四大特性分别指的是什么意思
·并发事务问题
指的是A事务和B事务它们俩在同时操作某一个数据库甚至某一张表的时候所引发的问题
问题 | 描述 |
脏读 | 一个事务读到另外一个事务还没有提交的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影 |
·事务隔离级别
隔离级别就是解决并发事务引发的问题的
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted (已读未提交) | √ | √ | √ |
Read committed(已读已提交) | × | √ | √ |
Repeatable Read(MySQL默认)(可重复读) | × | × | √ |
Serializable(串行化) | × | × | × |
注意:事务隔离级别越高,数据越安全,但是性能越低。
一般我们会用默认的不去更改。
查看事务隔离级别:
select @@transaction_isolation;
设置事务隔离级别:
set [session|global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable}