程序员

SQL-TCL(14)事务控制语言

2018-09-01  本文已影响55人  小白201808

Transaction Control language

事务:(存储引擎innodb支持事务)

一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。如:转账。

特点

(ACID)
原子性(Atomicity):一个事务要么都执行,要么都回滚(不可再分割)
一致性(Consistency):保证数据的状态操作前和操作后保持一致
隔离性(Isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
持久性(Durability):一个事务一旦提交,则数据将持久化到本地(则会永久的改变数据库的数据),除非其他事务对其进行修改

相关步骤:

1、开启事务
2、编写事务的一组逻辑操作单元(多条sql语句)
3、提交事务或回滚事务
#演示事务的使用步骤:(以转账为例)
#开启事务
set autocommit = 0;
start transaction;
#编写一组事务语句
update account set balance =500 where usename ='张无忌';
update account set balance =1500 where usename ='郭襄';
#结束事务
commit;

事务的分类:

隐式事务,没有明显的开启和结束事务的标志

比如
insert、update、delete语句本身就是一个事务

显式事务,具有明显的开启和结束事务的标志

   前提:取消自动提交功能
   set autocommit=0;
    1、开启事务
    start transaction;可省略
    2、编写事务的一组逻辑操作单元(多条sql语句)
    insert
    update
    delete
    设置回滚点:savapoint 回滚点名;
    3、提交事务或回滚事务
    提交 :commit;
    回滚:rollback;
    回滚到指定的地方:rollback to 回滚点名;

使用到的关键字

set autocommit=0;
start transaction;
commit;
rollback;

savepoint  断点
commit to 断点
rollback to 断点

事务的隔离级别:

事务并发问题如何发生?

当多个事务同时操作同一个数据库的相同数据时

事务的并发问题有哪些?

1.脏读:一个事务读取到了另外一个事务未提交的数据,读到其他事务的未提交的“更新”数据
2.不可重复读:同一个事务中,多次读取到的数据不一致
3.幻读:一个事务读取到了另外一个事务未提交的数据,只是读到的是其他事务“插入”的数据

如何避免事务的并发问题?

    通过设置事务的隔离级别
                          脏读          不可重复读       幻读
                          
    1、READ UNCOMMITTED     √            √               √
    
    
    2、READ COMMITTED       x             √               √
    
    3、REPEATABLE READ      x            x               √                  
    
    4、SERIALIZABLE(串行化) x            x            x
    

设置隔离级别:(mysql 默认级别为REPEATABLE READ )

mysql> show global variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
set session|global  transaction isolation =' 隔离级别名';
mysql> set global transaction_isolation ='read-committed';
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like '%isolation%';
+-----------------------+----------------+
| Variable_name         | Value          |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+
1 row in set (0.00 sec)

查看隔离级别也可以(前提是知道具体变量名):

select @@transaction_isolation;
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

注:这是本人的学习笔记及练习,如果有错误的地方望指出一起讨论,谢谢!

上一篇下一篇

猜你喜欢

热点阅读