1.什么是事务
指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。简单的说,事务就是并发控制的单位,是用户定义的一个操作序列
2.四大特性
1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency):在一个事务中,事务前后数据的完整性必须保持一致,可以想象银行转账、火车购票。
3.隔离性(Isolation):多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
4.持久性(Durability):如果程序设法完成两个update操作,还没执行commit或rollback命令,服务器突然宕机了,那么事务会在服务器重新上线后被回滚。如果程序完成了事务,并发出了commit指令,还没有将变化持久到永久存储区(修改的数据还位于内存,但没有被刷新到磁盘),服务器就宕机了,那么服务器重启时数据库服务器必须重新应用事务的变化。
3.事务使用命令
开启事务:start transaction/begain/begain work;(三种均可)
事务结束:end transaction
提交事务:commit/commit work
回滚事务:rollback
提交操作(事务成功)
start transaction
DML语句
commit
mysql> start transaction;#手动开启事务
mysql> insert into t_user(name) values('three');
mysql> commit;#commit之后即可改变底层数据库数据
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | one |
| 2 | two |
| 3 | three|
---------------------
回滚操作(事务失败)
start transaction
DML语句
rollback
mysql> start transaction;
mysql> insert into t_user(name) values('four');
mysql> rollback;
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | one |
| 2 | two |
| 3 | three|
+----+------+
3 rows in set (0.00 sec)
---------------------
回滚到指定保存点
savepoint pointname;//设置保存点
rollback to savepoint pointname;//回滚到指定保存点
mysql> start transaction;
mysql> insert into t_user(name) values('four');
mysql> savepoint four_point;
mysql> insert into t_user(name) values('five');
mysql> rollback to savepoint four_point;
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | one|
| 2 | two |
| 3 | three|
| 4 | four |
+----+------+
4 rows in set (0.00 sec)
---------------------
4.事务的四大特性--------隔离性
- 事务A和事务B之间具有一定的隔离性
- 隔离性有隔离级别(4个)
1.读未提交:read uncommitted
2.读已提交:read committed
3.可重复读:repeatable read
4.串行化:serializable
read uncommitted
- 事务A和事务B,事务A未提交的数据,事务B可以读取到
- 这里读取到的数据叫做“脏数据”
- 这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别
read committed
- 事务A和事务B,事务A提交的数据,事务B才能读取到
- 这种隔离级别高于读未提交
- 换句话说,对方事物提交之后的数据,我当前事物才能读取到
- 这种级别可以避免“脏数据”
- 这种隔离级别会导致“不可重复读取”
- Oracle默认隔离级别
repeatable read
- 事务A和事务B,事务A提交之后的数据,事务B读取不到
- 事务B是可重复读取数据
- 这种隔离级别高于读已提交
- 换句话说,对方提交之后的数据,我还是读取不到
- 这种隔离级别可以避免“不可重复读取”,达到可重复读取
- 比如1点和2点读到数据是同一个
- MySQL默认级别
- 虽然可以达到可重复读取,但是会导致“幻像读”
serializable
- 事务A和事务B,事务A在操作数据库时,事务B只能排队等待
- 这种隔离级别很少使用,吞吐量太低,用户体验差
- 这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发