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)
注:这是本人的学习笔记及练习,如果有错误的地方望指出一起讨论,谢谢!
网友评论