什么是事务
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
要么都成功,要么都失败!!
事务的ACID原则
原子性(Atom)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务的隔离级别
脏读
所谓脏读,就是指事务A读到了事务B还没有提交的数据。
例:比如银行取钱,事务A开启事务,此时切换到事务B,事务B开启事务–>取走100元,此时切换回事务A,事务A读取的肯定是数据库里面的原始数据,因为事务B取走了100块钱,并没有提交,数据库里面的账务余额肯定还是原始余额,这就是脏读。
幻读(虚读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
例:学生信息,事务A开启事务–>修改所有学生当天签到状况为false,此时切换到事务B,事务B开启事务–>事务B插入了一条学生数据,此时切换回事务A,事务A提交的时候发现了一条自己没有修改过的数据,这就是幻读,就好像发生了幻觉一样。幻读出现的前提是并发的事务中有事务发生了插入、删除操作。
不可重复读
所谓不可重复读,就是指在一个事务里面读取了两次某个数据,读出来的数据不一致。
例:以银行取钱为例,事务A开启事务–>查出银行卡余额为1000元,此时切换到事务B事务B开启事务–>事务B取走100元–>提交,数据库里面余额变为900元,此时切换回事务A,事务A再查一次查出账户余额为900元,这样对事务A而言,在同一个事务内两次读取账户余额数据不一致,这就是不可重复读。
不可重复读和幻读的区别
不可重复读的重点在于修改,幻读的重点在于添加和删除。
Mysql默认的事务隔离级别是可重复读,项目中一般用读已提交(Read Commited)这个隔离级别!
Mysql事务的使用
Mysql默认开始事务自动提交:
set sutocommit = 0 #关闭
set sutocommit = 1 #开启(默认)
手动处理事务:
set sutocommit = 0 #关闭自动提交
start transaction #标记事务的开始
### ·····
### 填写执行的sql语句
### ·····
commit #提交事务
rollback #回滚事务
set sutocommit = 1 #开启事务提交 结束!
设置事务保存、回滚点:
savepoint point_name #设置一个名为point_name的保存点
rollback to point_name #回滚到名为point_name的保存点
release savepoint point_name #释放保存点