什么是事务?
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
事务的基本定义
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。
事务的属性
谈到事务一般都是以下四点属性:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
事务的隔离级别
事务的隔离是为了解决多事务执行过程中产生的脏读、不可重复读、幻读等问题。
事务从低到高的四种隔离级别(其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低):
Read Uncommitted(读未提交)
一个事务可以读取另一个未提交事务(有修改操作)的数据。会出现脏读。
Read committed(读已提交)[比较常见]
一个事务要等另一个事务(有修改操作)提交后才能读取数据。若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。
但是会出现不可重复读问题:一个事务范围内两个相同的查询(查询间隔中另一个事务对查询的内容进行了修改)却返回了不同数据,这就是不可重复读。
Repeatable read(可重复读)
在开始读取数据(事务开启)时,不再允许修改操作。可避免脏读、不可重复读情况发生。
不可重复读问题对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
Serializable(串行化)[比较少见]
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
事物的控制
1、开启事物
语法:start transaction |begin 开启一个新的事物
1、创建一个库test5
2、创建一张表account(id 主键唯一自增)
3、插入数据
例如:开启事物,完成张三给李四转账200
Start transaction
Update account set balance = balance-200 where username=”张三”
Update account set balance = balance+200 where username=”李四”
注意:使用start transaction 开启一个新事物后,该事物不会自动提交,必须手动提交
2、提交事物
语法:commit
例如:开启事物,完成张三给李四转账200,提交事物
Start transaction
Update account set balance = balance-200 where username=”张三”
Update account set balance = balance+200 where username=”李四”
Commit;
3、回滚事物
语法:rollback;
注意:开启的事物未提交的时候可以回滚
例如:回滚事物(回到没有执行的状态)
Start transaction
Update account set balance = balance-200 where username=”张三”
Update account set balance = balance+200 where username=”李四”
Rollback