我对MySQL比较陌生。我只是“发现”了交易。
我知道他们服刑了,但从未调查过。
我想知道的是:
我在PHP中工作,并使用INNODB作为数据库引擎。
我可以只在发送查询之前设置autocommit = 0;
并在查询之后将其设置为1吗?
之所以这样问,是因为我已经做了一个相当大的项目,并且不需要将整个事情“转换”为交易。感觉好像有人将提交某项内容并将自动提交设置为0,而其他人将发送非事务查询,则第二个不会“解雇”,因为这不是交易。
如果我要使用事务,是否需要将其应用于整个项目?还是仅使用会话或其他解决方法?
谢谢!
答案 0 :(得分:0)
要将多条语句包装到单个事务中时,无需禁用package android.example.scorekeeper;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Random;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
Button b_ROLL;
ImageView red_4;
int score_A = 0;
int score_B = 0;
String winnerScore ;
Random r;
int rolledNumber;
public void addOneForTeamA(View V) {
score_A = score_A + 1;
displayForTeamA(score_A);
}
public void addTwoForTeamA(View V) {
score_A = score_A + 2;
displayForTeamA(score_A);
}
public void addThreeForTeamA(View V) {
score_A = score_A + 3;
displayForTeamA(score_A);
}
public void addFourForTeamA(View V) {
score_A = score_A + 4;
displayForTeamA(score_A);
}
public void addFiveForTeamA(View V) {
score_A = score_A + 5;
displayForTeamA(score_A);
}
public void addSixForTeamA(View V) {
score_A = score_A + 6;
displayForTeamA(score_A);
}
public void addOneForTeamB(View V) {
score_B = score_B + 1;
displayForTeamB(score_B);
}
public void addTwoForTeamB(View V) {
score_B = score_B + 2;
displayForTeamB(score_B);
}
public void addThreeForTeamB(View V) {
score_B = score_B + 3;
displayForTeamB(score_B);
}
public void addFourForTeamB(View V) {
score_B = score_B + 4;
displayForTeamB(score_B);
}
public void addFiveForTeamB(View V) {
score_B = score_B + 5;
displayForTeamB(score_B);
}
public void addSixForTeamB(View V) {
score_B = score_B + 6;
displayForTeamB(score_B);
}
public void WinnerScore(View v) {
if (score_B < score_A) {
String winner = "Team A is Winner";
System.out.println(winner);
} else {
String winner = "Team B is Winner";
System.out.println(winner);
}
}
/**
* Displays the given score for Team A.
*/
public void displayForTeamA(int score) {
TextView scoreView = (TextView) findViewById(R.id.a_score);
scoreView.setText(String.valueOf(score));
}
/**
* Displays the given score for Team B.
*/
public void displayForTeamB(int score) {
TextView scoreView = (TextView) findViewById(R.id.b_score);
scoreView.setText(String.valueOf(score));
}
/**
* Displays the winner from both teams.
*/
public void displayForwinner(String score) {
TextView scoreView = (TextView) findViewById(R.id.winner);
scoreView.setText(String.valueOf(score));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b_ROLL = (Button) findViewById(R.id.id_roll_the_dice);
red_4 = (ImageView) findViewById(R.id.id_red_1);
r = new Random();
b_ROLL.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rolledNumber = r.nextInt(6) + 1;
if (rolledNumber == 1) {
red_4.setImageResource(R.drawable.red_1);
} else if (rolledNumber == 2) {
red_4.setImageResource(R.drawable.red_2);
} else if (rolledNumber == 3) {
red_4.setImageResource(R.drawable.red_3);
} else if (rolledNumber == 4) {
red_4.setImageResource(R.drawable.red_4);
} else if (rolledNumber == 5) {
red_4.setImageResource(R.drawable.red_5);
} else if (rolledNumber == 6) {
red_4.setImageResource(R.drawable.red_6);
}
}
});
displayForTeamA(score_A);
displayForTeamB(score_B);
displayForwinner(winnerScore);
}
}
,只需使用mysqli的mysqli_begin_transaction()和mysqli_commit()函数/方法来启动/提交事务(我'让您知道如何回滚交易。)
如果您明确启动交易,那么它将在交易期间禁用autocommit:
已启用自动提交的会话可以通过以显式START TRANSACTION或BEGIN语句开始并以COMMIT或ROLLBACK语句结束的方式执行多语句事务。
请注意,即使启用了autocommit
,innodb也会将事务用于所有数据修改语句。所有这些设置意味着无需指定事务即可将每个数据修改语句包装到单语句事务中。