一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务要么全部执行成功,要么全部失败。
所以记住事务的几个基本概念,如下:
1、事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行的原子操作。
2、事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。
3、事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。
在之前的学习中了解到,MyISAM是不支持事务的,InnoDB支持事务,支持行锁。
有一个管理用户账户的表,如果要操作一个事务:从zhangsan账户里转50到liuchao账户里,简单来说需要两个sql语句,如果是InnoDB存储引擎,在执行中间发生了异常,可以回滚到最初的状态;而使用MyISAM,如果第一条语句执行完发生异常,那么张三的账户就永远少了50。。。

每一个事务必须满足下面的4个特性:
持久性的体现:例如在数据库读写操作时,先把数据写到cache缓存,再写到磁盘,那如果在缓存到磁盘这个过程中宕机了或断电了,数据会丢失,不过没关系,MySQL有redo log重做日志,undo log回滚日志,来保证数据库的永久性!(实际上 ACID的ACD特性都是由redo log 和undo log保证的,I特性是由事务的锁机制保证实现的)
事务处理不经隔离,并发执行事务时通常会发生以下的问题:
测试以下命令:
在数据库中使用下面语句来查看事务是否为自动提交
select @@autocommit;

0表示手动提交事务,1表示自动提交事务,设置事务提交方式为手动提交方式:

再开启一个MySQL客户端,设置手动提交:

BEGIN; 开启一个事务
COMMIT; 提交一个事务
ROLLBACK; 回滚一个事务到初始的位置
SAVEPOINT point1; 设置一个名字为point1的保存点
ROLLBACK TO point1; 事务回滚到保存点point1,而不是回滚到初始状态
SET TX_ISOLATION=‘REPEATABLE-READ’; 设置事务的隔离级别
SELECT @@ TRANSACTION_ISOLATION; 查询事务的隔离级别,可以看到默认工作在可重复读级别。

MySQL支持的四种隔离级别是:
1、TRANSACTION_READ_UNCOMMITTED。未提交读。 说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的。
2、TRANSACTION_READ_COMMITTED。已提交读。 说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生。
3、TRANSACTION_REPEATABLE_READ。可重复读。说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。
4、TRANSACTION_SERIALIZABLE。串行化。是最高的事务级别,它防止读脏数据,不可重复读和虚读。(并发特性都不要了。。。。)

备注:
事务隔离级别越高,为避免冲突所花费的性能也就越多。
在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别。
待补充。。