まず、トランザクション
MySQLでは、トランザクションは実際に仕事の最小不可分の単位で、トランザクションは、ビジネスの整合性を確保することができます
たとえば、私たちの銀行振込:
A、Bには、と同等の100ドルを、回します
update user set monry=money-100 where name='a'
update user set monry=money+100 where name='b'
一つだけのステートメントが正常に実行され、データの矛盾が発生する前と後に他は、正常に実行されていない場合は、現実には、二つの文を必要としています。
解決するために使用されるトランザクション:複数のSQL文を同時にオンに成功したか失敗しながら、必要な場合があります。
どのように1. MySQLの制御トランザクション?
MySQLのデフォルトが自動的に送信され
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.52 sec)
2.デフォルトのトランザクションオープンの役割は何ですか?
- 私たちは、SQL文を実行するために行ったとき、効果がすぐに反映され、ロールバックすることはできません。
- ここでもいくつかの概念があります(ロールバック)、私たち、例えば:
- データベースを作成し、テーブルを作成し、データを挿入
mysql> create database bank;
Query OK, 1 row affected (0.64 sec)
mysql> use bank;
Database changed
mysql> create table user(
-> id int primary key,
-> name varchar(20),
-> money int
-> );
Query OK, 0 rows affected (0.93 sec)
mysql> insert into user values(1,'a',1000);
Query OK, 1 row affected (0.51 sec)
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
+----+------+-------+
1 row in set (0.00 sec)
トランザクションロールバック:SQL(ロールバック;)の実装の効果を元に戻します
次のコールのロールバック
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
+----+------+-------+
1 row in set (0.00 sec)
でもロールバックすることはできないことを示す、データがまだ存在している、ロールバックと呼ばれることがわかります、デフォルトに提出されたデータの実装後のステートメントを追加しました。
我々は、デフォルトのトランザクション、設定することで変更することができます0ウェイ偽MySQLのデフォルト設定に提出されたset autocommit=0;
(上の1を、0オフ)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.54 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)
上記の動作、閉じて自動的に提出mysqlの(コミット)
ここでは、操作中に再び:(自動コミットを検証するために、この時間は、閉じられました)
mysql> insert into user values(2,'b',1000); #插入数据
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
| 2 | b | 1000 |
+----+------+-------+
2 rows in set (0.00 sec)
mysql> rollback; #进行回滚
Query OK, 0 rows affected (0.07 sec)
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
+----+------+-------+
1 row in set (0.00 sec)
驚きの驚きは、単にデータがなくなって挿入しません。我々は効果を確認するために、(デフォルトの提出を閉じて)文の実装を完了した場合にのみ、一時的な効果であり、仮想テーブルである私達のデータベースには、実際のところはありません。
ここでは、使用することができますコミット提出
#再插入一次数据
mysql> insert into user values(2,'b',1000);
Query OK, 1 row affected (0.00 sec)
#手动提交数据
mysql> commit;
Query OK, 0 rows affected (0.15 sec)
#再撤销,是不可以撤销的(事务的一个特性:持久性)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
| 2 | b | 1000 |
+----+------+-------+
2 rows in set (0.00 sec)
限りコミットとして、何の使用をロールバックしない、耐久性のああ〜
自動コミット:@@自動コミット= 1
マニュアルの提出:コミット
ロールバック:ロールバック(提出がない場合には、それが提出することができます)
言い換えれば、取引は返却する機会を提供してくれます!!!
先に述べたように、ケースにはロールバックすることができ、文が正常に実行されていないことがわかりました。チェックした後、その後、手動で有効にすることをコミットし、実際の結果を生成します。
私たちは、そのトランザクションを自動送信し、閉じています:
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
3. [その他の事項?
手動で開いているトランザクション:開始またはトランザクションを開始し、トランザクションを手動で開くには、私たちを助けることができます
ここで転送例を作るために:
mysql> update user set money=money-100 where name='a';
Query OK, 1 row affected (0.95 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update user set money=money+100 where name='b';
Query OK, 1 row affected (0.14 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)
#事务回滚
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)
ここでは、ロールバックは、今すぐに有効に自動送信モード、いつでも実行文、今自動コミット= 1ので、何の効果も見られません。
あなたはこれらの二つの文を入力する前に今、入力を開始またはトランザクションを開始します
#加上begin;或者 start transaction 开启事务
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
#对a、b进行转账操作
mysql> update user set money=money-100 where name='a';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update user set money=money+100 where name='b';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
#看一下表
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 800 |
| 2 | b | 1200 |
+----+------+-------+
2 rows in set (0.00 sec)
#事务回滚
mysql> rollback;
Query OK, 0 rows affected (0.57 sec)
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)
開いているトランザクションの後、コミット提出たら、それは何の使用をロールバックしない再その後、(つまり、最後の提出時のトランザクションである)ロールバックすることはできません
物事の第二に、4つの特徴
1.アトミック
- トランザクションが同時に成功のいずれか、または同じ時間に成功していない、不可分ユニットのセットです
2.一貫性
- データの整合性は、前と後に同じことをする必要があります(データベースの整合性:、すべてのデータは、データベースの状態の整合性を呼びかけ、すべての制約に沿ったものである時点でのデータベースの場合は)
3.分離
- 物事の単離は、データへのユーザの同時アクセス複数のユーザがすることはできない強固なものが他のユーザと干渉することを意味し、同時複数のトランザクション間でデータを相互に分離されます
4. 持久性
- 永続性のものが提出されると、それはデータベースに障害が発生したり、それがどんな影響を与えた場合でも、その後、データが永続的に変更することを意味します