1、數據庫事務的概念mysql
事務是一種機制、一個操做序列,包含了一組數據庫操做命令,而且把全部的命令做爲一個總體一塊兒向系統提交或撤銷操做請求,即這一組數據庫命令要麼都執行,要麼不都執行。linux
事務是一個不可分割的工做邏輯單元,在數據庫系統上執行併發操做時,事務是最小的控制單元。sql
事務適用於多用戶同時操做的數據庫系統的場景,如銀行、保險公司及證券交易系統等等。經過事務的完整性以保證數據的一致性。數據庫
2、事務的ACID特色
事務具備四個屬性:ACID
原子性(Atomicity)
一致性(Consistency)
隔高性(Isolation)
持久性(Durability)
一、原子性
事務是一個完整的操做,事務的各元素是不可分的(原子的),事務的全部元素必須做爲一個總體提交或回滾。若是事務中的任何元素失敗,則整個事務將失敗。併發
二、一致性
當事務完成時,數據必須處於一致狀態:在事務開始以前,數據庫彙總存儲的數據處於一致狀態;在正在進行的事務中,數據可能處於不一致的狀態;當事務完成時,數據必須再次回到已知的一致狀態。ui
三、隔離性
對數據進行修改的全部併發事務是彼此隔離的,這代表事務必須是獨立的,它不該該以任何方式依賴於或影響其餘事務。修改數據的事務能夠在另外一個使用相同數據的事務開始以前訪問這些數據,或者在另外一個使用相同數據的事務結束以後訪問這些數據。this
四、持久性
事務的持久性指無論系統是否發生了故障,事務處理的結果都是永久的。一旦事務被提交,事務的效果會被永久地保留在數據庫中。spa
3、事務的操做orm
默認狀況下MySQL的事物是自動提交的,當SQL語句 提交時事物便自動提交。事務
手動對事物進行控制的方法:
一、事物處理命令控制
事物處理命令控制事物:
begin:開始一個事物
commit:提交一個事物
rollback:回滾一個事物(撤銷)
事物的操做必須基於Innodb存儲引擎
操做:
[root@localhost ~]# mysql -uroot -p123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 5.5.41-MariaDB-log MariaDB Server
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| auth |
| client |
| crushlinux |
| lty |
| mysql |
| performance_schema |
| test |
+--------------------+
8 rows in set (0.00 sec)
MariaDB [(none)]> use auth
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [auth]> show tables;
+----------------+
| Tables_in_auth |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)
MariaDB [auth]> drop table user;
Query OK, 0 rows affected (0.01 sec)
MariaDB [auth]> create table users(user_name char(18) not null,user_passwd char(50) default'',primary key (user_name));
Query OK, 0 rows affected (0.02 sec)
MariaDB [auth]> alter table auth.users engine=innodb;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
begin實例:
MariaDB [auth]> begin ; //事物開始
Query OK, 0 rows affected (0.00 sec)
MariaDB [auth]> insert into users values('lisi',password('123'));
Query OK, 1 row affected (0.01 sec)
MariaDB [auth]> insert into users values('wangwu',password('321'));
Query OK, 1 row affected (0. 00 sec)
MariaDB [auth]> commit; //事物提交
Query OK, 0 rows affected (0.00 sec)
MariaDB [auth]> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| lisi | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| wangwu | *7297C3E22DEB91303FC493303A8158AD4231F486 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)
裏面存儲的數據是永久的事物
rollback實例:
MariaDB [auth]> begin;
Query OK, 0 rows affected (0.00 sec)
MariaDB [auth]> update users set user_passwd=password('') where user_name='lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [auth]> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| lisi | |
| wangwu | *7297C3E22DEB91303FC493303A8158AD4231F486 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)
MariaDB [auth]> rollback; //事物回滾(撤銷)從begin開始的全部的命令都將被撤銷
Query OK, 0 rows affected (0.01 sec)
MariaDB [auth]> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| lisi | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| wangwu | *7297C3E22DEB91303FC493303A8158AD4231F486 |
+-----------+-------------------------------------------+
2 rows in set (0.00 sec)
二、使用set設置事務處理方式
set autocommit=0:禁止自動提交
set autocommit=1:開啓自動提交
MariaDB [auth]> set autocommit=0; //禁止自動提交
Query OK, 0 rows affected (0.00 sec)
MariaDB [auth]> insert into users values('lty',password('123'));
Query OK, 1 row affected (0.00 sec)
MariaDB [auth]> insert into users values('jhc',password('456'));
Query OK, 1 row affected (0.00 sec)
MariaDB [auth]> commit;
Query OK, 0 rows affected (0.01 sec)
MariaDB [auth]> set autocommit=1; //開啓自動提交
Query OK, 0 rows affected (0.00 sec)
不能進行回滾,一條SQL語句就會提交一次