[0928 | 39日目]取引(簡潔に)

まず、トランザクション

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. 持久性

  • 永続性のものが提出されると、それはデータベースに障害が発生したり、それがどんな影響を与えた場合でも、その後、データが永続的に変更することを意味します

おすすめ

転載: www.cnblogs.com/fxyadela/p/11605151.html