是否可以使Java方法具有事务性?

时间:2015-11-06 13:40:57

标签: java

对于一个项目,我正在构建一个独立的Java应用程序。在某一点上,我想将数据插入到几个数据库表中。这些insert语句都是从一个方法调用的,并且都有自己的Java类,其中包含执行语句的代码。像这样:

DataService1 ds1 = new DataService1();
DataService2 ds2 = new DataService2();

updateDatabase() {
  ds1.insertData1(data);
  ds2.insertData2(data2);
}

DataService1DataService2是连接到数据库并执行insert语句的类。

是否可以使此方法(updateDatabase())具有事务性?如果表中的一个插入失败,该方法回滚所有其他sql语句?我知道你可以使sql语句成为事务,但insert语句都在不同的类中。 或者我的方法首先是错误的?

谢谢!

2 个答案:

答案 0 :(得分:0)

你可以做的就是使用try-catch。让ds1和ds2尝试插入它,如果失败则使用private void button4_Click(object sender, EventArgs e) { try { using (SqlConnection conn = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=D:\\VS_project\\WindowsFormsApplication1\\WindowsFormsApplication1\\myInfo.mdf;Integrated Security=True")) { conn.Open(); using (SqlCommand command = new SqlCommand("INSERT INTO myInfo(Name,Address,Gender,LangKnownHindi)VALUES(@name, @address,@gender,@lang)", conn)) { command.Parameters.AddWithValue("@name", textBox1.Text); command.Parameters.AddWithValue("@address", textBox2.Text); command.Parameters.AddWithValue("@gender", Gender); command.Parameters.AddWithValue("@lang", LANG_Hin); command.ExecuteNonQuery(); } conn.Close(); MessageBox.Show("Saved SuccessFully!!!!!"); } } catch (SqlException ex) { MessageBox.Show(ex.Message); } } (你必须创建那个,它只是一个扩展Exception的类。)在{{1}中然后,您可以应用使每个DataService尝试回滚的代码。

答案 1 :(得分:0)

当然可以。您只需要确保在方法开头打开一个事务,将该事务用于您的状态,如果其中一个语句失败,则回滚事务。

Hibernate等ORM系统可以自动为您处理。