**原子性:**一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
**一致性:**在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
**隔离性:**数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
**持久性:**事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 创建数据表
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; # 回滚
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; # 因为回滚所以数据没有插入
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql>
假设有两个事务T1和T2,T1正在执行一个更新操作但尚未提交,此时T2执行查询操作并读取了T1更新前的数据,这时候T2就会出现脏读的情况。例如:
如果T2在T1提交前执行了SELECT语句,那么T2可能会读取到T1未提交的数据,造成脏读。
假设有两个事务T1和T2,T1正在执行一个插入操作,此时T2执行查询操作,并读取了符合条件的数据,但是在T1提交之前,T2再次执行相同的查询,结果集却不一致,这时候T2就会出现幻读的情况。例如:
如果T2在T1提交前执行了SELECT语句,那么T2可能会在第一次查询中得到1条记录,在第二次查询中得到2条记录,造成幻读。
假设有两个事务T1和T2,T1正在执行一个更新操作,此时T2执行查询操作,并读取了符合条件的数据,但是在T1提交之前,T2再次执行相同的查询,发现结果集不一致,这时候T2就会出现不可重复读的情况。例如:
如果T2在T1提交前执行了第一次SELECT语句,得到age=20,然后T1执行了UPDATE操作,将age修改为25,T2再次执行SELECT语句,得到age=25,这时候T2就会发现结果集不一致,造成不可重复读。