什么是事务
要求MySQL的表类型为Innodb才支持事务。
在数据库操作中,一项事务是指由一条或多条对数据库更新的sql语句所组成的一个不可分割的工作单元。只有当事务中的所有操作都正常完成了,整个事务才能被提交到数据库,如果有一项操作没有完成,就必须撤消整个事务。
例如在银行的转帐事务中,假定张三从自己的帐号上把1000元转到李四的帐号上,相关的sql语句如下:
update account set monery=monery-1000 where name='zhangsan'
update account set monery=monery+1000 where name='lisi'
这个两条语句必须作为一个完成的事务来处理。只有当两条都成功执行了,才能提交这个事务。如果有一句失败,整个事务必须撤消。
事务的特点
事务的四大特性:ACID
- Atomic原子性:事务中的操作要么都成功,要么都失败;
- Consistency一致性:事务前后,数据库的状态是正确一致的。例如,张三转给李四100元钱,转账操作后,系统的状态应该是张三少100元,李四多100元,系统的状态是正确的;
- Isolation隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
- Durability持久性:事务结束后,状态应当是稳定的,不能被回滚;
事务的隔离级别
数据库为事务的隔离性提供了不同等级的隔离策略,来应对事务并发所产生的数据问题。并发事务可能产生的现象:
脏读
一个事务读取另一个未提交的事务的数据。导致前后读取的结果不一致。例如:
用户A向用户B转账100元,对应SQL命令如下
1. update account set money=money+100 where name=’B’; (此时A通知B)
2. update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交&