事务(ACID)的特性:
- 原子性:一系列操作,要么一起成功,要么全部失败(单线程批量操作)
- 一致性:多线程同时修改同一数据时,最终结果和操作的动作需要保持一致(多线程操作)
- 隔离性:事务和事务之间的关系
- 持久性:事务提交之后数据库的修改是永久性的
事务的操作:
- 开启(start transaction):开启事务
- 关闭事务两种方式:
- 回滚(rollback):事务执行失败,所执行的操作
- 提交(commit):事务操作无任何错误,将数据持久化的最后一步操作
事务操作和存储过程(非事务性):
- 存储过程所产生的结果无法进行回滚
- 事务操作一定程度上,能够保证数据的安全性
事务的隔离级别
- serializable:(创建一个事务,另一个事务就不能开启,可以同时避免脏读、幻读、不可重复读)
- read-commited(Oracle默认的隔离级别):(读取事务提交后的结果)
- read-uncommited(风险最大,效率最高):(可读取事务未提交的结果)
- repeatable-read[default]:(同一条件查询返回的结果永远是一致的,无论事务是否提交)
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|
serializable | N | N | N |
read-uncommitted | Y | Y | Y |
read-committed | N | Y | Y |
repeatable-read | N | N | Y |
事务隔离性操作
- 修改当前命令行下的事务隔离性
MariaDB [db_job]> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
MariaDB [db_job]> set tx_isolation='serializable';
Query OK, 0 rows affected (0.00 sec)
MariaDB [db_job]> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+
1 row in set (0.00 sec)
- 修改全局事务隔离性
MariaDB [db_job]> set global transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)
MariaDB [db_job]> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+
1 row in set (0.00 sec)