一、什么是事务(transaction)
- 事务就是一堆的逻辑语句+逻辑判断
- 一个数据库事务由一条或者多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败
- 事务是保证数据的完整性和一致性的重要手段
- 注意事项、@@autocommit作用
系统变量@@autocommit默认是打开的,这意味着任何1条DML语句是一个事务,会自动提交(Oracle数据库默认是关闭的,要自动提交)。
要将@@autocommit关闭,防止误操作造成数据的丢失损坏
实际使用中,应该使用SET语句来关闭自动提交,否则一个事务不可能由多条SQL语句构成
mysql> SHOW VARIABLES LIKE '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.01 sec)
二、.为什么要使用事务
要将一部分的操作作为一个整体来执行,要么所有语句都成功,要么所有语句都失败
例如银行转账,应该是我主转账给你,然后你收到钱,这才是完整的步骤,如果我转账了,而你没有收到钱,那么所有的执行失败
三、.事务类型
- DML事务:由一条或者多条DML语句构成
如果关闭autocommit参数,需要手工commit或者rollback
如果没有关闭autocommit参数,Mysql会自动执行commit操作
如果显式开启一个事务,就需要手工执行commit和rollback
- DDL事务:总是由一条DDL语句构成(create、drop、alter语句)
执行完了DDL之后之后,Mysql自动执行一个commit操作
- DCL事务:总是由一条DCL语句构成(创建一个用户类似的操作)数据控制事务
执行完了DCL操作时,Mysql自动执行一个commit
保存点是事务的一个事件
四、.commit/rollback
commit:将所有操作永久写入数据库当中
rollback:回滚之前的操作,不写入数据库
- commit和rollback操作前的数据情况
1.所有数据都是在内存中操作,不写入磁盘(不持久化)
2.如果事务未提交或回滚,别的会话不可以看到事务修改的数据(不允许脏读)
3.本事务修改的数据行会被锁定,不允许其他事务进行操作
- commit和rollback操作后的数据情况
1.所有数据都持久化到磁盘
2.所有的会话都可以看到修改后的数据
3.提交之后,锁定的行会释放,其他事物可以对这些行进行操作
五、.其它事务控制语句
SAVEPOINT identifier :建立一个保存点,用来在事务中做一个标记,专门提供给rollback to语句使用